> 技术文档 > Eureka+LoadBalancer实现服务注册与发现

Eureka+LoadBalancer实现服务注册与发现

目录

一、相关文章

二、兼容说明

三、服务注册到EurekaServer

四、服务发现

五、LoadBalancer负载均衡


一、相关文章
  • 基础工程:gradle7.6.1+springboot3.2.4创建微服务工程-CSDN博客

  • Eureka服务端启动:Eureka服务端启动-CSDN博客

  • LoadBalancer官方文档:https://spring.io/guides/gs/spring-cloud-loadbalancer

  • LoadBalancer自定义策略:https://blog.csdn.net/BASK2312/article/details/129025006

二、兼容说明
  • 与SpringBoot3兼容的SpringCloud里的eureka-client依赖不含Ribbon,新增了LoadBalancer。

  • 如果想使用Ribbon做负载均衡,参考Eureka+Ribbon实现服务注册与发现-CSDN博客。

  • 使用SpringBoot3,即使单独引用了Ribbon也是不生效的。

三、服务注册到EurekaServer

1、父工程cloud-demo3.0引入依赖

  • SpringCloud及SpringCloudAlibaba需根据SpringBoot参照[版本对照表]。

  • 版本对照表地址:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明

  • dependencyManagement引入依赖版本管理包,其管理的依赖引入不需要再指定版本。

  • 查看管理依赖版本spring-cloud-dependencies:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies/2023.0.1

  • 查看管理依赖版本spring-cloud-alibaba-dependencies:https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies/2023.0.0.0-RC1

dependencyManagement { imports { mavenBom \"com.alibaba.cloud:spring-cloud-alibaba-dependencies:2023.0.0.0-RC1\" } imports { mavenBom \"org.springframework.cloud:spring-cloud-dependencies:2023.0.1\" } } 

2、子工程build.gradle引入eureka-client

//eureka-client implementation \'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client\'//order-service引入springcloud2021开始,使用loadbalancer处理客户端负载均衡 implementation \'org.springframework.cloud:spring-cloud-starter-loadbalancer\'

3、子工程application.yml配置

eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka/

4、启动多个user-service,参考idea中同服务启动多个-CSDN博客

四、服务发现

1、在OrderApplication类创建RestTemplate

@Bean @LoadBalanced //添加使用负载均衡注解RestTemplate restTemplate() { return new RestTemplate(); }

2、服务远程调用

//示例:在order服根据用户ID拉取user服用户信息@Override public Order getOrderById(Long orderId) { //获取订单信息 Order order = orderMapper.getOrderById(orderId); //根据订单用户ID获取用户信息,通过host:port拼接请求路径//String url = \"http://localhost:8083/user/\" + order.getUserId(); //eureka方式:通过user-service服务名拼接请求路径String url = \"http://user-service/user/\" + order.getUserId(); //执行远程调用User user = restTemplate.getForObject(url, User.class); order.setUser(user); return order; }
五、LoadBalancer负载均衡

1、默认规则,详细分析可参考https://blog.csdn.net/BASK2312/article/details/129025006

  • 默认提供了两种不同的负载均衡器,分别是:RandomLoadBalancer(随机负载均衡器)和RoundRobinLoadBalancer(轮询负载均衡器)

2、指定使用随机策略

  • 创建一个类CustomLoadBalancerConfiguration

  • OrderApplication加注解@LoadBalanced、@LoadBalancerClients

/** * Spring Cloud LoadBalancer替代Ribbon实现 随机/轮询 方式负载均衡策略配置 */ public class CustomLoadBalancerConfiguration { /** * 自定义负载均衡策略(随机/轮询) * * @return ReactorLoadBalancer */@Bean ReactorLoadBalancer randomLoadBalancer(Environment environment, LoadBalancerClientFactory factory) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); //随机return new RandomLoadBalancer(factory.getLazyProvider(name, ServiceInstanceListSupplier.class), name); //轮询 //return new RoundRobinLoadBalancer(factory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);} }
@LoadBalancerClients(defaultConfiguration= CustomLoadBalancerConfiguration.class) @SpringBootApplication public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } @Bean @LoadBalanced //该注解表示使用负载均衡RestTemplate restTemplate() { return new RestTemplate(); } }