SpringCloud入门简述( 二 )


? 创建一个Eureka服务:
https://www.cnblogs.com/william-m/p/15991511.html
如果没有Eureka , 如何进行服务之间的调用?
? 使用Rest进行调用 , 先将RestTemplate注册到Bean , 然后:
@RestControllerpublic class MyController {private static final String REST_URL_PREFIX="http://localhost:8082";@Autowiredprivate RestTemplate restTemplate;@GetMApping("user/getAll")public User getById(@RequestParam Long id){return restTemplate.getForObject(REST_URL_PREFIX+"/user/getAll/"+id,User.class);}}3.1 三个角色#

  • 注册中心
  • Eureka Server , 可以让其他服务将相关信息注册进去 , 然后让相关服务发现这些服务并来调用
  • 服务提供者
  • Eureka Client , 将自身注册进Server中 , 提供自身的主机 , 端口 , 运行状况指示器URL , 主页和其他详细信息让其他服务去发现 , 一般都是完成某些具体业务的服务
  • 服务消费者
  • Eureka Client , 将自身注册进Server中 , 发现服务提供者并调用其相关接口 , 一般仅提供接口供外部调用 , 然后调用服务提供者的接口完成具体的业务
3.2 AP原则#
C - consistency 强一致性
A - availability 可用性
P - partition tolerance 分区容错性
【SpringCloud入门简述】? Eureka遵循的是AP原则 , Eureka各个节点都是平等的 , 部分服务节点的下线不会影响正常服务的调用 , 只要该服务还剩下一个节点在线就可以进行正常的服务访问 , 即保证了服务可用 , 但是并不能保证查询到的信息是最新的 。Zookeeper的CP原则与之不同 , Zookeeper会有一个master节点来保证一致性 , 一旦master节点挂掉 , 剩余的节点会重新选举一个leader , 而选择的过程需要时间 , 这期间会使得该服务瘫痪 , 所以需要满足高可用的话该情况是不能够容忍的 。
4、Ribbon 负载均衡#? Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具 , 基于Netflix Ribbon实现 , 通过轮询、随机等算法选择一个可用服务 。
? 目的:将用户的请求平摊的分配到多个服务上 , 实现高可用
4.1 客户端负载均衡与服务器端负载均衡的区别#
SpringCloud入门简述

文章插图
 
? 最大区别:服务清单所存储的位置
  • 服务器端负载均衡
? 客户端先发送请求到负载均衡服务器 , 然后由负载均衡服务器通过负载均衡算法 , 在众多可用的服务器之中选择一个来处理请求 。
  • 客户端负载均衡
? 客户端自己维护一个可用服务器地址列表 , 在发送请求前先通过负载均衡算法选择一个将用来处理本次请求的服务器 , 然后再直接将请求发送至该服务器 。
4.2 服务调用#? 逻辑时序:RestTemplate发起请求 → 负载均衡器拦截器拦截 → LoadBalanceClient获取ILoadBalance → 获取服务列表 → 根据负载均衡器选择一个server → 发起请求 → 记录调用信息
4.3 负载均衡算法重写#public class MyBalanceRule extends AbstractLoadBalancerRule {// 继承AbstractLoadBalancerRule并重写choose算法@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(), key);}public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {return null;}Server server = null;while (server == null) {if (Thread.interrupted()) {return null;}List<Server> upList = lb.getReachableServers();// 获取活着的服务List<Server> allList = lb.getAllServers();// 获取所有服务int serverCount = allList.size();if (serverCount == 0) {return null;}// =============================================//自定义负载均衡算法// server = ......//===============================================if (server == null) {Thread.yield();continue;}if (server.isAlive()) {return (server);}server = null;Thread.yield();}return server;}}// 添加配置类 , 指定负载均衡算法@Configurationpublic class MyRuleConfig {@Beanpublic IRule myRule(){return new MyBalanceRule();}}5、Feign负载均衡#? Feign是声明式的 web service 客户端 , SpringCloud对Feign进行了封装 , 可以与Ribbon和Eureka使用以支持负载均衡 , 只需要创建一个接口并添加@FeignClient("服务名")注解即可 。


推荐阅读