集群

为什么需要集群?

如果只有一个注册中心服务器,会存在单点故障所以要集群。

什么是集群?

一组协同工作的服务实体,用以提供比单一服务实体更具扩展性和可用性的服务平台。
多台服务器集中在一起,实现同一业务

集群原理图

怎么做?

生产环境把Eureka部署多个服务器

服务提供者和服务消费者修改

eureka:client:serviceUrl:defaultZone: http://peer1:1000/eureka/,http://peer2:1001/eureka/ #注册中心地址instance:prefer-ip-address: true #使用ip地址注册instance-id: user-server1  #指定服务的id
server:port: 2000
spring:application:name: user-server

注意:instance-id需要修改 , 而 spring.application.name 不需要修改 , 端口需要修改

#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka

总结:

如果是只有一个Eureka注册中心,会存在单点故障,要做集群,做了集群后,服务提供者和消费者注册服务或发现服务时要配置集群(把多个Eureka都配置上).

为什么需要负载均衡

为了提供并发量,有时同一个服务提供者可以部署多个(商品服务)。这个客户端在调用时要根据一定的负责均衡策略完成负载调用

负载均衡原理图

重启注册中心,和两个服务提供者,如以下效果就ok

服务消费者常见负载均衡实现技术

Ribbon

Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端负载均衡算法

简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中列出load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法

负载均衡测试
1.创建项目

普通maven项目

2.导入jar
<!--公共代码依赖--><dependency><groupId>cn.itsource.springcloud</groupId><artifactId>User_interface</artifactId><version>1.0-SNAPSHOT</version></dependency><!--springboot支持--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--eureka客户端,服务消费者也要从注册中心获取可用服务列表--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--客户端负载均衡实现 ribbon-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
yml 配置
server:port: 9002
eureka:client:registerWithEureka: false #不注册到Eureka,不在注册中心显示service-url:#defaultZone: http://localhost:7001/eurekadefaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka
负载均衡的类 MyConfig.java
@Configuration
public class MyConfig {/*** SpringMvc 提供的一个基于Rest风格的http调用工具* @LoadBalanced :ribbon的负载均衡标签,赋予RestTemplate有负债均衡的能力*/@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}/***  使用随机策略 RandomRule()*//* @Beanpublic IRule rule(){return new RandomRule();}*/
}
订单消费服务Controller
/*订单消费者服务
* */
@RestController
public class OrderConsumerController {@Autowiredprivate RestTemplate restTemplate;/** 订单消费者方法  浏览器调用* @HystrixCommand 开启方法的短路功能,如果方法出现异常 fallbackMethod* 指向的方法,然后返回托底数据* */@HystrixCommand(fallbackMethod = "getEmployeeByIdFallback")@GetMapping("/order/employee/{id}")public JsonResult getEmployeeById (@PathVariable("id")Long id){System.out.println("OrderConsumerController.getEmployeeById被调用了......");//String url = "http://localhost:2000/employee/"+id;String url = "http://employee-server/employee/"+id;Employee employee = restTemplate.getForObject(url, Employee.class);return JsonResult.me().setData(employee);}
测试

浏览器输入url localhost:3000/order/employee/1

负载均衡策略

ribbon通过服务名获取到服务列表后,要根据一定规则来选择一个服务实例来完成调用.这个规则就叫负载均衡策略.

1)IRule

通过配置不同IRule的子类,可以选择不同负载均衡策略,也就是从服务列表以特定策略选择一个服务来完成调用。当然也可以自定义。所以负载均衡策略可以分为内置和自定义。

2)内置负载均衡策略

在主配置类中 配一个@Bean new出策略即可

Feign

feign底层还是ribbon,只是进行了封装,让我们以接口的方式进行调用

前面的可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下

Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon和Hystrix(关于Hystrix我们后面再讲),可以让我们不再需要显式地使用这两个组件。

Feign具有如下特性:

可插拔的注解支持,包括Feign注解和JAX-RS注解;
支持可插拔的HTTP编码器和解码器;
支持Hystrix和它的Fallback;
支持Ribbon的负载均衡;
支持HTTP请求和响应的压缩。

这看起来有点像我们
springmvc模式的Controller层的RequestMapping映射
Feign是用@FeignClient来映射服务的。

操作

1)创建项目-copy
2)导入jar
 <!--公共代码依赖--><dependency><groupId>cn.itsource.springcloud</groupId><artifactId>User_interface</artifactId><version>1.0-SNAPSHOT</version></dependency><!--springboot支持--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--eureka客户端,服务消费者也要从注册中心获取可用服务列表--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--feign的支持--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
3)配置yml
eureka:client:serviceUrl:defaultZone: http://peer1:1000/eureka/,http://peer2:1001/eureka/ #注册中心地址instance:prefer-ip-address: true #使用ip地址注册instance-id: employeeWeb-server #指定服务器id
server:port: 4000
spring:application:name: employeeWeb-serverfeign:hystrix:enabled: true #开启熔断支持client:config:remote-service:           #服务名,填写default为所有服务connectTimeout: 30000readTimeout: 30000
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 30000

配置类 开启Feign

@SpringBootApplication
@EnableFeignClients("cn.itsource.client")//@EnableFeignClients开启Feign的客户端
public class DeptServerApplication4000

编写Feign的接口

 /*** @FeignClient(value="user-server") : 针对于用户服务调用的 Fiegn的客户端接口*  value属性就是该接口要调用的目标服务的名字* Feign是如何实现服务调用的:*   1.通过@FeignClient(value="user-server")标签上的服务名字能够找到要调用的目标服务*   2.通过接口中的方法的 @GetMapping的url路径找到目标服务的controller的方法 ,*   所以要保证Feign客户端接口的方法和目标服务的对应的方法要完全一致。**/@FeignClient(value="user-server")public interface UserFeignClient {@GetMapping("/user/{id}")User getUserById(@PathVariable("id")Long id);}

Feign客户端接口的方法和目标服务的对应的方法要完全一致

调用

@RestController
public class DeptConsumerController {@Autowiredprivate UserFeignClient userFeignClient ;/*** 该方法是浏览器来调用* @param id* @return*/@GetMapping("/dept/user/{id}")public User getUserById(@PathVariable("id") Long id){User user = userFeignClient.getUserById(id); //使用Feign的接口调用return user;}
}

Hystrix

一.雪崩效应

一个微服务的故障导致整个微服务调用链全部瘫痪

二.Hystrix介绍

解决服务器故障(雪崩)的一个组件 ,它可以实现:隔离 ,熔断 ,降级,缓存

  • 隔离 :包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。

  • 熔断 :当请求次数达到规定的阀值都出现服务故障(超时),Hystrix就把服务标记为短路状态.

    正常情况下,断路器处于关闭状态(Closed),如果调用持续出错或者超时,电路被打开进入熔断状态(Open),后续一段时间内的所有调用都会被拒绝(Fail Fast),一段时间以后,保护器会尝试进入半熔断状态(Half-Open),允许少量请求进来尝试,
    如果调用仍然失败,则回到熔断状态
    如果调用成功,则回到电路闭合状态;

  • 降级 :高并发情况下 ,为了保证一些主要的服务有足够的资源不出问题 ,会认为的关掉一些无关紧要的服务,然后返回一些托底的数据,给用户一个友好的提示。

  • 缓存 :Hystrix内部会把请求做缓存

三.Ribbon集成Hystrix - springcloud-order-server-3000

1.导入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>
2.controller方法贴注解
 /*** 该方法是浏览器来调用*  @HystrixCommand :开启方法的短路功能 , 如果方法出现异常,会调用 fallbackMethod*  指向的方法 ,然后返回托底数据*/@HystrixCommand(fallbackMethod = "getUserByIdFallback")@GetMapping("/order/user/{id}")public JsonResult getUserById(@PathVariable("id") Long id){System.out.println("OrderConsumerController.getUserById被调用了......");String url = "http://user-server/user/"+id;User user = restTemplate.getForObject(url, User.class);return JsonResult.me().setData(user);}
3.托底方法
 public JsonResult getUserByIdFallback(@PathVariable("id") Long id){return JsonResult.me().setSuccess(false).setMessage("服务展示不可用,请骚后重试[服务降级]");}

注意:托底方法的参数和返回结果要和原方法一致

四.Feign集成Hystrix - springcloud-dept-server-4000

1.开启Hystrix
feign:hystrix:enabled: true #开启熔断支持client:config:remote-service:           #服务名,填写default为所有服务connectTimeout: 30000readTimeout: 30000
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 30000
2.修改Fiegn客户端接口
@FeignClient(value="user-server" ,fallback = UserFeignClientFallback.class)
public interface UserFeignClient {@GetMapping("/user/{id}")User getUserById(@PathVariable("id")Long id);
}

fallback = UserFeignClientFallback.class : 该类是当前接口的实现类 ,也是托底数据所在的处理类

3.托底实现
@Component
public class UserFeignClientFallback implements UserFeignClient {@Overridepublic User getUserById(Long id) {System.out.println("托底数据执行....");return new User(-1L,"托底数据","");}
}

注册中心集群 服务负载均衡 雪崩效应Hystrix相关推荐

  1. 集群服务负载均衡------LVS

    个人的理解,以一种通俗易懂的方式讲述出来,如果有哪些地方说的不正确的话,希望大家留言指出来.笔者会非是常的感谢! Cluster服务器集群,直接理解为一些单一的服务器的集合通过某种方式组合起来,为客户 ...

  2. 源码分析Dubbo Invoker概述----服务发现、集群、负载均衡、路由体系

    Invoker,负载网络调用组件,底层依懒与网络通信,Invoker主要负责服务调用,自然与路由(比如集群)等功能息息相关,本节先从整体上把控一下Dubbo服务调用体系,服务发现.集群.负载均衡.路由 ...

  3. 大话集群和负载均衡,太强了!

    作者:阿苍老师 www.cnblogs.com/nullering/p/9311151.html 在"高并发,海量数据,分布式,NoSql,云计算--"概念满天飞的年代,相信不少朋 ...

  4. Dubbo面试杀招--Dubbo集群容错负载均衡

    点赞再看,养成习惯,微信搜一搜[三太子敖丙]关注这个喜欢写情怀的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系 ...

  5. 分布式?集群?负载均衡?(此博客非原创,转载自微信公众号,为避免文章链接消失,copy过来的,如有问题请私信我删除,谢谢)

    分布式?集群?负载均衡? 我曾经面试过一家企业,当时描述完我在老东家完成的微服务架构后,面试官问了我一个问题: 面试官:您有做过分布式系统吗? 我:有,刚刚我描述的微服务架构就是分布式的-- 面试官: ...

  6. 简单的几句话让你理解”什么是备份、容灾、集群、负载均衡”

    关于容灾.备份.集群.负载均衡这类概念,很多朋友都容易混淆,到底它们之间有什么区别?今天小编我就给大家分别介绍一下,让大家有个深刻的理解 ! 一.备份概念的理解 "备份"只是将数据 ...

  7. docker swam 集群实现负载均衡

    docker swam 集群实现负载均衡 文章目录 docker swam 集群实现负载均衡 1. 初始化集群 2. 虚拟IP 3. 服务发现 4. 多主机LB和服务发现 1. 初始化集群 第一个节点 ...

  8. 集群,分布式,负载均衡,负载均衡算法

    集群 集群的概念 计算机集群通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算机通常称为节点,通常通过局域网连接, ...

  9. 搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡

    转载:https://www.cnblogs.com/xiongze520/p/10308720.html 分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟 ...

最新文章

  1. 自定义类似于listView中Item背景
  2. SAP UI5 应用的 OData XML 格式的元数据请求解析原理,基于 DOMParser
  3. 美颜相机window 开源_X-Window系统| 免费和开源软件
  4. python爬取b站弹幕分析_python爬取B站视频弹幕分析并制作词云
  5. 网络管理员&MCSE2003之2:使用虚拟机Vmware建立多电脑网络环境
  6. 2018阿里编程测验题:最短汉密尔顿回路
  7. 高峰论坛:专家热议物联网行业如何迎风飞扬
  8. BSS/SSID/BSSID、VAP和ESS
  9. 短语匹配-match_phrase以及slop参数
  10. android应用统计获取api,APICloud
  11. qt离线下载地址5.14.2
  12. 电脑WiFi图标不见了?!怎么办......≡ (▔﹏▔) ≡
  13. 树莓派4b学习笔记三--基于Ubuntu搭建Docker 和portainer,基于Docker 搭建Homeassistant、EMQX
  14. python爬虫论文参考文献格式_Python爬虫进阶必备 | XX文学加密分析实例
  15. Spring Security系列教程11--Spring Security核心API讲解
  16. flex布局——最后一行左对齐的实现方式(css功能实现)
  17. 0基础学RS(十四)VTP(VLAN中继协议)作用及配置
  18. 蓝桥杯试题 算法训练 绘制地图 C/C++解法 AC(最近,WYF正准备参观他的点卡工厂。WYF集团的经理氰垃圾需要帮助WYF设计参“观”路线。现在,氰垃圾知道一下几件事情。。。。)
  19. 后渗透之meterpreter学习笔记
  20. 刷题记录——动态规划

热门文章

  1. 推荐一个大佬,文章适合偷偷读!
  2. 从SOD到OOD(C++编码风格)
  3. 积分价值调整的两个原因
  4. Cisco IP Phone 7960/7940 SCCP firmware 转换成SIP firmware过程
  5. Python数据可视化:香港地图、房价可视化,绘制气泡图
  6. 墨者学院-在线靶场-HTTP头注入漏洞测试(X-Forwarded-for) Writeup
  7. 【codeforces 794A】Bank Robbery
  8. 有趣的网站:河蟹娱乐
  9. oracle19c安装向导空白页,安装Oracle19c提示Warning问题解决
  10. 【思维题 阈值 期望】10.3奥义商店