【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon | 您所在的位置:网站首页 › springcloudalibaba负载均衡 › 【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon |
文章目录
一、Eureka1、服务提供者与消费者2、Eureka原理分析3、搭建Eureka4、服务注册5、模拟多服务实例启动6、服务的发现
二、Ribbon1、负载均衡的原理2、源码分析3、负载均衡策略4、饥饿加载
一、Eureka
1、服务提供者与消费者
服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务) 服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口) 很明显,这是一个相对的概念。 2、Eureka原理分析上一篇中,远程调用时,url参数是写死在代码中的,而不同的测试、生产、开发环境IP不同,有集群时,端口也不能固定。 很明显,硬编码肯定行不通。Eureka就是来解决这个问题的。
接下来将user和order服务注册到eureka中: 在user模块的pom文件中引入eureka客户端依赖 org.springframework.cloud spring-cloud-starter-netflix-eureka-client 在application.yaml文件中增加注册中心地址的配置 server: port: 8081 spring: application: name: userservice eyreka: client: service-url: # eureka的地址信息 defaultZone: http://127.0.0.1:10086/eureka 重启user模块(order模块操作步骤相同),注册成功上面完成的注册都是单服务实例的,接下来在IDEA中模拟启动多个服务实例: 右键选择拷贝接下来实现:在order服务中完成服务信息的拉取,然后通过负载均衡挑选一个user服务,实现远程调用 服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡 修改order代码,将服务IP和端口改为服务名 String url ="http://userservice/user/" + order.getUserId(); 在order启动类OrderApplication中的RestTemplate添加负载均衡注解 @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } 分别调用order接口两次,传参101和102,看它远程调用了哪个user服务实例我在浏览器中直接访问http://userservice/user/,访问失败,这是因为userservice既不是可用域名,也不是IP。那order调用到user服务的过程中经历了什么呢? 具体信息,在源码中打断点来调试看看。 2、源码分析@LoadBalanced注解,就标识了调用方当前这个restTemplate这个对象发起的请求,要被Ribbon拦截
在LoadBalancerInterceptor接口重写的intercent方法上打断点,调用order接口(中途会对user服务发起远程调用),断点进入到了这里: 继续往下,看到了Ribbon对象 继续往下:成功从eureka拿到服务列表信息
Ribbon的负载均衡策略是由IRule接口来定义的,它的每一个子接口就是一种策略。 具体的含义为:
代码方式:在order-service中的OrderApplication类中,定义一个新的IRule: @Bean public IRule randomRule(){ return new RandomRule(); //改为随机 }配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则 userservice: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则此时,多次调用order接口(代码中途远程调用user): http://localhost:8080/order/102可以看到转发到user实例上的请求不再有明显规律。 4、饥饿加载重启order服务,然后两次访问order接口,发现耗时相差巨大:
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,因此请求时间会很长。 饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下配置开启饥饿加载: ribbon: eager-load: enabled: true #开启饥饿加载 clients: userservice # 指定对userservice这个服务饥饿加载 # clients为list,可添加多个 |
CopyRight 2018-2019 实验室设备网 版权所有 |