- 因此 Eureka Server 可以很好的应对因网络故障导致部分节点失联的情况,而不会像 Zookeeper 那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪 。
- 经验:建议生产环境打开自我保护机制
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();}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 5分钟搭建公网https网页文件服务器,免费权威TLS证书
- 一个比 Nginx 功能更强大的 Web 服务器
- 2021寒假儿童关爱服务四送活动总结?2021寒假儿童关爱服务观后感
- 微型投影仪选购及保养技巧
- 一般公司或者团队是怎么进行代码开发并且部署到服务器上的?
- 微信拉黑后再拉回来对方有提示吗?
- 家用无线路由器DHCP服务器配置方法
- 500行代码,教你用python写个微信飞机大战
- 什么是微内核架构设计?
- 云计算核心技术Docker教程:docker-compose控制服务启动和关闭顺序