一、创建 Eureka 微服务
0、SpringBoot 和 SpringCloud 版本
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.9.RELEASE</version> </parent>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR10</version> <type>pom</type> <scope>import</scope> </dependency>
1、引入 Eureka 服务端依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
2、启动类加 @EnableEurekaServer 注解
@EnableEurekaServer @SpringBootApplication public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
3、配置 yaml 文件,把 Eureka 服务注册到 Eureka 注册中心
server: port: 10086 spring: application: name: eureka-server # 将eureka-server注册到Eureka注册中心 eureka: client: service-url: # 需要加【/eureka】,否则无法注册 defaultZone: http://127.0.0.1:10086/eureka
4、访问 Eureka 服务端,查看注册中心的服务列表信息
二、其他微服务注册到 Eureka 中
1、添加 Eureka 客户端依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2、在 yaml 文件中配置 Eureka 服务端信息
server: port: 8080 spring: application: name: order-service eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka
server: port: 8081 spring: application: name: user-service eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka
3、IDEA 2022 中启动多个服务实例
三、服务发现
1、启动 RestTemplate 的负载均衡
使用服务名,根据负载均衡规则挑选服务提供者
@Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); }
2、根据服务名从 Eureka 注册中心中获取服务的IP和端口号
// String url = "http://localhost:8081/user/" + order.getUserId(); // 硬编码 // 👇 根据服务名从 Eureka 注册中心中获取服务的IP和端口号 String url = "http://user-service/user/" + order.getUserId();
四、Ribbon 负载均衡原理
LoadBalancerInterceptor 会拦截被 @LoadBalanced 注解标注的 RestTemplate 发起的请求。它实现了 ClientHttpRequestInterceptor 接口,该接口作用:拦截客户端HTTP请求。LoadBalancerInterceptor 的 intercept 方法中获取服务名称,把服务名称交给 RibbonLoadBalanceClient,RibbonLoadBalanceClient 把服务名称交给 DynamicServerListLoadBalancer,DynamicServerListLoadBalancer 从 Eureka 注册中心获取该服务名的所有的实例信息,然后根据负载均衡规则挑选一个服务实例(chooseServer
)。负载均衡规则由 IRule 接口指定,IRule 的实现类有:RoundRobinRule(轮询)、RetryRule、RandomRule(随机)
五、修改负载均衡规则
@Bean public IRule iRule() { return new RandomRule(); }
user-service: ribbon: # user-service的负载均衡规则是:随机 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
六、饥饿加载
ribbon: eager-load: enabled: true # 饥饿创建负载均衡客户端RibbonLoadBalanceClient clients: user-service # 指定对user-service服务执行饥饿加载
🍀RibbonLoadBalanceClient 默认是懒创建,首次访问的时候才创建(首次请求响应时间会比较长)。
🍀饥饿加载:项目创建的时候就创建 RibbonLoadBalanceClient