一、原理分析
1、消费者该如何获取服务提供的具体信息
服务提供者启动时向Eureka注册自己的信息,Eureka保存这些信息。消费者根据服务名称向Eureka拉取提供者信息
2、如果有多个服务提供者,消费者该如何选择?
服务消费者利用负载均衡算法,从服务列表中挑选一个
3、消费者如何感知服务提供者健康状态
服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态,Eureka会更新记录服务列表信息,心跳不正常会被剔除。消费者就可以拉取到最新的信息
EurekaServer:服务端
记录服务信息、心跳监控
EurekaClient:客户端
(1)服务提供者:注册自己的信息到EurekaServer,每隔30秒向EurekaServer发送心跳
(2)服务消费者:根据服务名称从EurekaServer拉去服务列表。基于服务列表做负载均衡,选中一个微服务后发起远程调用
二、EurekaServer实现
1、搭建EurekaServer服务
(1)引入依赖
<!--eureka服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
(2)启动类添加注解开关
@EnableEurekaServer
(3)添加application.yml文件配置
server:
port: 10001# 服务端口
spring:
application:
name: eurekaserver # eureka的服务名称
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10001/eureka
2、EurekaServer服务注册
(1)引入依赖
<!--eureka客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(2)添加application.yml文件配置
spring:
application:
name: userservice# user服务的服务名称
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10001/eureka
3、服务拉取
(1)url访问路径,用服务名称代替ip、端口
String url = "http://userservice/user/" + order.getUserId();
(2)在启动类中的RestTemplate添加负载均衡注解
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
三、Ribbon负载均衡
(1)Ribbon负载均衡规则
规则接口是IRule。默认实现是ZoneAvoidanceRule,根据zone选择服务列表,然后轮询
(2)负载均衡自定义两种方式
配置灵活,但修改时需要重新打包发布
@Bean
public IRule randomRule() {
return new RandomRule();
}
直观、方便无需重新打包发布,但是无法做全局配置
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
(3)Ribbon默认加载方式是懒加载。更改加载方式
ribbon:
eager-load:
enabled: true # 开启饥饿加载
clients: # 指定饥饿加载的服务名称
- userservice