集群

为什么需要集群?

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

什么是集群?

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

集群原理图

怎么做?

生产环境把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. Python 的编码问题UnicodeDecodeError: 'ascii' codec can't decode byte ××× in postition
  2. Glusterfs 分布式存储安装部署
  3. xshell通过隧道连接_工作常见问题--如何解决xshell远程连接自动断开的问题
  4. 监控服务器已断开正在自动重连,远程服务器已断开与发送连接器的连接
  5. 标识位:可以用以确定鼠标点击的是哪一个按钮或者是文本框
  6. 一维卷积详细解释(转载+自己笔记)
  7. element ui 表单验证为正整数
  8. 数据结构(四)串的顺序存储
  9. WinPcap笔记(7):分析数据包(1)
  10. SQL模糊查询语句和Escape转义字符
  11. Spring官方RSocket Broker 0.3.0发布: 快速构建你的RSocket架构
  12. 网络图片 base64 java_java图片转base64和真实的结果不一样
  13. 智慧城市发展未来PSD分层海报模板|科技突破你的想象!
  14. 【CSS3】Advanced3:Universal, Child, and Adjacent Selectors
  15. Anaconda3 + Python3.6 + PyTorch0.4.0 安装步骤
  16. js根据银行卡号判断属于哪个银行,并返回银行缩写及银行卡类型--bin识别
  17. 倍福PLC_添加CX2500-0060以太网模块后无法从TwinCAT软件扫描到问题
  18. 世界上公认最快的学习法 - 弗曼学习法
  19. java中write方法作用_JAVA中的懒人神器—方法(有返回值)
  20. 支付宝php40247,支付宝APP支付 显示 系统繁忙 请稍后再试 ALI40247

热门文章

  1. 配置别名 配置alias
  2. UNIX编程艺术感觉这本书,挺好的,不知道大家看过没呢?
  3. h5故障代码_美的空调故障代码h5 看完你就知道了
  4. CLR学习之初识CLR
  5. 浅谈Linux PCI设备驱动(二)
  6. 顺序,二分,插值,斐波那契 查找算法
  7. 墨者学院-SQL注入漏洞测试(报错盲注)
  8. 如果打架,一定要战胜对手!
  9. C++基础—缺省参数
  10. NVIDIA三大专业显卡制造商