微服务:Eureka,Ribbon,Hystrix( 六 )


  • 因此 Eureka Server 可以很好的应对因网络故障导致部分节点失联的情况,而不会像 Zookeeper 那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪 。
  • 经验:建议生产环境打开自我保护机制
在单机测试的时候很容易满足心跳失败比例在 15 分钟之内低于 85%,这个时候就会触发 Eureka 的保护机制,一旦开启了保护机制(默认开启),则服务注册中心维护的服务实例就不是那么准确了,此时通过修改 Eureka Server 的配置文件来关闭保护机制,这样可以确保注册中心中不可用的实例被及时的剔除(不推荐) 。
eureka:server:# 关闭自我保护模式(默认为 true)enable-self-preservation: false 
Ribbon 负载均衡关于负载均衡负载均衡一般分为服务器端负载均衡和客户端负载均衡 。
所谓服务器端负载均衡,比如 Nginx、F5(硬件负载) 这些,请求到达服务器之后由这些负载均衡器根据一定的算法将请求路由到目标服务器处理 。
所谓客户端负载均衡,比如 Ribbon,服务消费者客户端会有一个服务器地址列表,调用方在请求前通过一定的负载均衡算法选择一个服务器进行访问,负载均衡算法的执行是在请求客户端进行 。
Ribbon 是 Netflix 发布的负载均衡器 。Eureka 一般配合 Ribbon 进行使用,Ribbon 利用从 Eureka 中读取到服务信息,在调用服务提供者提供的服务时,会根据一定的算法进行负载 。
Ribbon 高级应用需求:
复制商品微服务 lagou-service-product,命名为 lagou-service-product2,端口号 9001;在商品微服务中定义接口,返回当前服务实例占用的端口号 。
页面静态化微服务通过负载均衡策略调用商品微服务的 controller 。
Eureka Server --服务实例列表--> 页面静态化微服务页面静态化微服务 --Ribbon--> 负载均衡算法 ----> [商品微服务 9000,商品微服务 9001,商品微服务 9002]在微服务中使用 Ribbon 不需要额外导入依赖坐标,微服务中引入过 eureka-client 相关依赖,会自动引入 Ribbon 相关依赖坐标 。
代码中使用如下,在服务消费者的 RestTemplate 上添加对应注解即可:
@SpringBootApplication@EnableDiscoveryClientpublic class PageApplication {public static void main(String[] args) {SpringApplication.run(PageApplication.class,args);}// 向容器中注入一个 RestTemplate,封装了 HttpClient@Bean@LoadBalanced // 启动请求的 Ribbon 负载均衡public RestTemplate restTemplate(){return new RestTemplate();}}在 lagou-serivce-product 中创建一个 Controller,定义方法返回当前微服务所使用的容器端口号:
com.renda.product.controller.ServiceInfoController
@RestController@RequestMapping("/service")public class ServiceInfoController {@Value("${server.port}")private String port;@GetMapping("/port")public String getPort(){return port;}}然后按照 lagou-serivce-product 复制创建 lagou-serivce-product2 微服务;端口改为 9001,除了 spring.applicaton.name 保持为 lagou-service-product,其它地方改为 lagou-service-product2;ProductApplication 改为 Product2Application;最后在父工程下手动加入新增的模块 。最后如果 IDEA 没有显示新增模块,就删掉父工程的新增模块引入,同步一次后,再把新增模块引入代码加回去并同步 。
在页面静态化微服务中调用 lagou-server-product 下的资源路径:http://lagou-server-product/server/query 。
@RestController@RequestMapping("/page")public class PageController {@AutowiredRestTemplate restTemplate;@GetMapping("/getProduct/{id}")public Products getProduct(@PathVariable Integer id) {String url = "http://lagou-service-product/product/query/" + id;return restTemplate.getForObject(url, Products.class);}@GetMapping("/loadProductServicePort")public String getProductServerPort() {return restTemplate.getForObject("http://lagou-service-product/service/port", String.class);}}Ribbon 负载均衡策略Ribbon 内置了多种负载均衡策略,内部负责复杂均衡的顶级接口为 com.netflix.loadbalancer.IRule,接口简介:
package com.netflix.loadbalancer;?/** * Interface that defines a "Rule" for a LoadBalancer. A Rule can be thought of * as a Strategy for loadbalacing. Well known loadbalancing strategies include * Round Robin, Response Time based etc. ** @author stonse **/public interface IRule{/** choose one alive server from lb.allServers or* lb.upServers according to key** @return choosen Server object. NULL is returned if none*server is available*/?public Server choose(Object key);public void setLoadBalancer(ILoadBalancer lb);public ILoadBalancer getLoadBalancer();}


推荐阅读