注册中心集群 服务负载均衡 雪崩效应Hystrix
集群
为什么需要集群?
如果只有一个注册中心服务器,会存在单点故障所以要集群。
什么是集群?
一组协同工作的服务实体,用以提供比单一服务实体更具扩展性和可用性的服务平台。
多台服务器集中在一起,实现同一业务
集群原理图
怎么做?
生产环境把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相关推荐
- 集群服务负载均衡------LVS
个人的理解,以一种通俗易懂的方式讲述出来,如果有哪些地方说的不正确的话,希望大家留言指出来.笔者会非是常的感谢! Cluster服务器集群,直接理解为一些单一的服务器的集合通过某种方式组合起来,为客户 ...
- 源码分析Dubbo Invoker概述----服务发现、集群、负载均衡、路由体系
Invoker,负载网络调用组件,底层依懒与网络通信,Invoker主要负责服务调用,自然与路由(比如集群)等功能息息相关,本节先从整体上把控一下Dubbo服务调用体系,服务发现.集群.负载均衡.路由 ...
- 大话集群和负载均衡,太强了!
作者:阿苍老师 www.cnblogs.com/nullering/p/9311151.html 在"高并发,海量数据,分布式,NoSql,云计算--"概念满天飞的年代,相信不少朋 ...
- Dubbo面试杀招--Dubbo集群容错负载均衡
点赞再看,养成习惯,微信搜一搜[三太子敖丙]关注这个喜欢写情怀的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系 ...
- 分布式?集群?负载均衡?(此博客非原创,转载自微信公众号,为避免文章链接消失,copy过来的,如有问题请私信我删除,谢谢)
分布式?集群?负载均衡? 我曾经面试过一家企业,当时描述完我在老东家完成的微服务架构后,面试官问了我一个问题: 面试官:您有做过分布式系统吗? 我:有,刚刚我描述的微服务架构就是分布式的-- 面试官: ...
- 简单的几句话让你理解”什么是备份、容灾、集群、负载均衡”
关于容灾.备份.集群.负载均衡这类概念,很多朋友都容易混淆,到底它们之间有什么区别?今天小编我就给大家分别介绍一下,让大家有个深刻的理解 ! 一.备份概念的理解 "备份"只是将数据 ...
- docker swam 集群实现负载均衡
docker swam 集群实现负载均衡 文章目录 docker swam 集群实现负载均衡 1. 初始化集群 2. 虚拟IP 3. 服务发现 4. 多主机LB和服务发现 1. 初始化集群 第一个节点 ...
- 集群,分布式,负载均衡,负载均衡算法
集群 集群的概念 计算机集群通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算机通常称为节点,通常通过局域网连接, ...
- 搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡
转载:https://www.cnblogs.com/xiongze520/p/10308720.html 分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟 ...
最新文章
- Python 的编码问题UnicodeDecodeError: 'ascii' codec can't decode byte ××× in postition
- Glusterfs 分布式存储安装部署
- xshell通过隧道连接_工作常见问题--如何解决xshell远程连接自动断开的问题
- 监控服务器已断开正在自动重连,远程服务器已断开与发送连接器的连接
- 标识位:可以用以确定鼠标点击的是哪一个按钮或者是文本框
- 一维卷积详细解释(转载+自己笔记)
- element ui 表单验证为正整数
- 数据结构(四)串的顺序存储
- WinPcap笔记(7):分析数据包(1)
- SQL模糊查询语句和Escape转义字符
- Spring官方RSocket Broker 0.3.0发布: 快速构建你的RSocket架构
- 网络图片 base64 java_java图片转base64和真实的结果不一样
- 智慧城市发展未来PSD分层海报模板|科技突破你的想象!
- 【CSS3】Advanced3:Universal, Child, and Adjacent Selectors
- Anaconda3 + Python3.6 + PyTorch0.4.0 安装步骤
- js根据银行卡号判断属于哪个银行,并返回银行缩写及银行卡类型--bin识别
- 倍福PLC_添加CX2500-0060以太网模块后无法从TwinCAT软件扫描到问题
- 世界上公认最快的学习法 - 弗曼学习法
- java中write方法作用_JAVA中的懒人神器—方法(有返回值)
- 支付宝php40247,支付宝APP支付 显示 系统繁忙 请稍后再试 ALI40247