当前位置:网站首页>[微服务]Eureka
[微服务]Eureka
2022-06-26 23:09:00 【fate _zore】
Eureka

order-service 如何得知 user-service 实例地址?
- user-service 服务实例启动后,将自己的信息注册到 eureka-server(Eureka服务端),叫做服务注册
- eureka-server 保存服务名称到服务实例地址列表的映射关系
- order-service 根据服务名称,拉取实例地址列表,这个叫服务发现或服务拉取
order-service 如何从多个 user-service 实例中选择具体的实例?
order-service从实例列表中利用负载均衡算法选中一个实例地址,向该实例地址发起远程调用
order-service 如何得知某个 user-service 实例是否依然健康,是不是已经宕机?
- user-service 会每隔一段时间(默认30秒)向 eureka-server 发起请求,报告自己状态,称为心跳
- 当超过一定时间没有发送心跳时,eureka-server 会认为微服务实例故障,将该实例从服务列表中剔除
- order-service 拉取服务时,就能将故障实例排除了
搭建EurekaServer
搭建 eureka-server
引入 SpringCloud 为 eureka 提供的 starter 依赖,注意这里是用 server
引入依赖
<!-- eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
配置文件
server:
port: 10086 #服务端口
spring:
application:
name: eureka-server #微服务名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/ #eureka地址信息
其中 default-zone 是因为前面配置类开启了注册中心所需要配置的 eureka 的地址信息,因为 eureka 本身也是一个微服务,这里也要将自己注册进来,当后面 eureka 集群时,这里就可以填写多个,使用 “,” 隔开。
注册 eureka-server
引入依赖
<!-- eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
修改配置文件
spring:
application:
name: ****** #微服务名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/ #eureka地址信息
注册成功

idea可以实现服务的复制

但是为了避免端口冲突,需要重新设置端口号-Dserver.port=端口号

服务拉取
在 order-service 中完成服务拉取,然后通过负载均衡挑选一个服务,实现远程调用
首先给 RestTemplate 这个 Bean 添加一个 @LoadBalanced注解,用于开启负载均衡
/** * 创建RestTemplate并注入spring容器 */
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
修改 OrderService 访问的url路径,用服务名代替ip、端口:
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.利用restTemplate发起请求,查询用户
String url = "http://user-server/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
order.setUser(user);
// 4.返回
return order;
}
Ribbon负载均衡
我们添加了 @LoadBalanced 注解,即可实现负载均衡功能,这是什么原理呢?
SpringCloud 底层提供了一个名为 Ribbon 的组件,来实现负载均衡功能。

负载均衡流程

基本流程如下:
- 拦截我们的
RestTemplate请求 http://userservice/user/1 RibbonLoadBalancerClient会从请求url中获取服务名称,也就是 user-serverDynamicServerListLoadBalancer根据 user-server 到 eureka 拉取服务列表- eureka 返回列表,localhost:8081、localhost:8082
IRule利用内置负载均衡规则,从列表中选择一个,例如 localhost:8081RibbonLoadBalancerClient修改请求地址,用 localhost:8081 替代 userservice,得到 http://localhost:8081/user/1,发起真实请求
源码跟踪
为什么我们只输入了service名称就可以访问了呢?之前还要获取ip和端口。
显然有人帮我们根据service名称,获取到了服务实例的ip和端口。它就是LoadBalancerInterceptor,这个类会在对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。
我们进行源码跟踪:
1)LoadBalancerIntercepor

可以看到这里的intercept方法,拦截了用户的HttpRequest请求,然后做了几件事:
request.getURI():获取请求uri,本例中就是 http://user-service/user/8originalUri.getHost():获取uri路径的主机名,其实就是服务id,user-servicethis.loadBalancer.execute():处理服务id,和用户请求。
这里的this.loadBalancer是LoadBalancerClient类型,我们继续跟入。
2)LoadBalancerClient
继续跟入execute方法:

代码是这样的:
- getLoadBalancer(serviceId):根据服务id获取ILoadBalancer,而ILoadBalancer会拿着服务id去eureka中获取服务列表并保存起来。
- getServer(loadBalancer):利用内置的负载均衡算法,从服务列表中选择一个。本例中,可以看到获取了8082端口的服务
放行后,再次访问并跟踪,发现获取的是8081:

果然实现了负载均衡。
负载均衡策略
负载均衡的规则都定义在 IRule 接口中,而 IRule 有很多不同的实现类:

不同规则的含义如下:
| 内置负载均衡规则类 | 规则描述 |
|---|---|
| RoundRobinRule | 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
| AvailabilityFilteringRule | 对以下两种服务器进行忽略:(1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule 规则的客户端也会将其忽略。并发连接数的上限,可以由客户端设置。 |
| WeightedResponseTimeRule | 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
| ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。 |
| BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器。 |
| RandomRule | 随机选择一个可用的服务器。 |
| RetryRule | 重试机制的选择逻辑 |
默认的实现就是 ZoneAvoidanceRule,是一种轮询方案。
自定义负载均衡策略
通过定义IRule实现可以修改负载均衡规则,有两种方式:
- 代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:
@Bean
public IRule randomRule(){
return new RandomRule();
}
- 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:
user-server: # 给某个微服务配置负载均衡规则,这里是userservice服务
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
注意,一般用默认的负载均衡规则,不做修改。
饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true
clients: user-server #这是个list
边栏推荐
- Système de distribution Unity Composants en tissu (y compris les dépendances d'appel dynamique)
- Product design in the extreme Internet Era
- Development and learning route of golang language
- 【混合编程jni 】第七篇之JNI 的命令行们
- 论文解读(LG2AR)《Learning Graph Augmentations to Learn Graph Representations》
- 运筹说 第66期|贝尔曼也有“演讲恐惧症”?
- Three solutions for improving embedded software development environment
- 利用burp精准定位攻击者
- xshell的安装、xftp的安装
- go中的微服务和容器编排
猜你喜欢

DAST 黑盒漏洞扫描器 第五篇:漏洞扫描引擎与服务能力

12 color ring three primary colors

go语言的爬虫和中间件

CVPR2022-不对称分辨率图像的立体匹配

客户端实现client.go客户端类型定义连接

The user adds a timer function in the handler () goroutine. If it times out, it will be kicked out

CVE-2022-30190 Follina Office RCE分析【附自定义word模板POC】

VB. Net class library (advanced version - 1)
![Selenium电脑上怎么下载-Selenium下载和安装图文教程[超详细]](/img/ec/1c324dcf38d07742a139aac2bab02e.png)
Selenium电脑上怎么下载-Selenium下载和安装图文教程[超详细]

WP collection plug-in tutorial no thanks for WordPress collection of rules
随机推荐
客户端实现client.go客户端类型定义连接
电子协会 C语言 1级 30 、 等差数列末项计算
【混合编程jni 】第七篇之JNI 的命令行们
[try to hack] forward shell and reverse shell
Implement the queue through two stacks
代码之外:写作是倒逼成长的最佳方式
Introduction de l'opérateur
Simple test lightweight expression calculator fly
电子协会 C语言 1级 29 、 对齐输出
6.24 learning content
From bitmap to bloom filter, C # implementation
Microservices, an important part of cloud native architecture
12色彩环三原色
ASP.Net Core创建MVC项目上传文件(缓冲方式)
C language: a simple calculator is implemented by using code many times
How to download on selenium computer -selenium download and installation graphic tutorial [ultra detailed]
Electronic Society C language level 1 29, alignment output
利用burp精准定位攻击者
WordPress collection plug-ins are recommended to be free collection plug-ins
Unity4.6版本下载