当前位置: 首页 > news >正文

一元云淘网站开发自己做网站用软件下载

一元云淘网站开发,自己做网站用软件下载,广州一点网络科技有限公司,学校网站定位一、前言 接下来是开展一系列的 SpringCloud 的学习之旅#xff0c;从传统的模块之间调用#xff0c;一步步的升级为 SpringCloud 模块之间的调用#xff0c;此篇文章为第三篇#xff0c;即介绍 Ribbon 负载均衡服务调用 二、概述 2.1 Ribbon 是什么 Spring Cloud Ribbon…一、前言 接下来是开展一系列的 SpringCloud 的学习之旅从传统的模块之间调用一步步的升级为 SpringCloud 模块之间的调用此篇文章为第三篇即介绍 Ribbon 负载均衡服务调用 二、概述 2.1 Ribbon 是什么 Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具。 简单的说Ribbon 是 Netflix 发布的开源项目主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon 客户端组件提供一系列完善的配置项如连接超时重试等。简单的说就是在配置文件中列出 Load Balancer简称 LB后面所有的机器Ribbon 会自动的帮助你基于某种规则如简单轮询随机连接等去连接这些机器。我们很容易使用 Ribbon 实现自定义的负载均衡算法。 2.2 Ribbon 资料 可以进入官网查看该工具的使用方式github 源码的地址在这不过到目前为止 Ribbon 也进入了维护模式如下图 2.3 Ribbon 用途 Ribbon 可以实现负载均衡Load Balance的功能。 2.3.1 负载均衡是什么 简单的说就是将用户的请求平摊的分配到多个服务上从而达到系统的 HA高可用。常见的负载均衡有软件 NginxLVS硬件 F5 等。 2.3.2 Ribbon 和 Nginx 区别 Ribbon 本地负载均衡客户端 和 Nginx 服务端负载均衡有什么区别呢 Nginx 是服务器负载均衡客户端所有请求都会交给 nginx然后由 nginx 实现转发请求。即负载均衡是由服务端实现的。 Ribbon 本地负载均衡在调用微服务接口时候会在注册中心上获取注册信息服务列表之后缓存到 JVM 本地从而在本地实现 RPC 远程服务调用技术。 2.3.3 总结 前面第二篇文章我们通过配置订单模块的负载均衡轮询的去访问我们的两个支付模块 8001 和 8002 采用的技术就是 负载均衡 RestTemplate 调用。 三、Ribbon 负载均衡演示 3.1 架构说明 Ribbon 在工作时分成两步第一步先选择 EurekaServer它优先选择在同一个区域内负载较少的 server。第二步再根据用户指定的策略在从 server 取到的服务注册列表中选择一个地址。 Ribbon 提供了多种策略比如轮询、随机和根据响应时间加权。 3.2 pom 说明 之前在 cloud-consumer-order80 订单模块我们并没有引入 Ribbon 的依赖也可以使用它那是因为 spring-cloud-starter-netflix-eureka-client 自带了 spring-cloud-starter-ribbon 引用如下图 3.3 RestTemplate 在没有使用 OpenFeign 组件之前我们还是使用 RestTemplate 来进行远程服务的调用其主要使用的方法就是 getForObject/getForEntity、postForObject/postForEntity 如下所示 RestController Slf4j public class OrderController {Resourceprivate RestTemplate restTemplate;// public static final String PaymentSrv_URL http://localhost:8001;public static final String PAYMENT_SRV http://CLOUD-PAYMENT-SERVICE;GetMapping(/consumer/payment/create)public CommonResult create(Payment payment){// 客户端用浏览器是get请求但是底层实质发送post调用服务端8001// return restTemplate.postForObject(PAYMENT_SRV/payment/create,payment,CommonResult.class);return restTemplate.postForEntity(PAYMENT_SRV/payment/create,payment,CommonResult.class).getBody();}// 返回对象为响应体中数据转化成的对象基本上可以理解为JsonGetMapping(/consumer/payment/get/{id})public CommonResult getPayment(PathVariable Long id){return restTemplate.getForObject(PAYMENT_SRV /payment/get/id, CommonResult.class, id);}// 返回对象为 ResponseEntity 对象包含了响应中的一些重要信息比如响应头、响应状态码、响应体等GetMapping(/consumer/payment/getForEntity/{id})public CommonResult getPayment2(PathVariable Long id){ResponseEntityCommonResult entity restTemplate.getForEntity(PAYMENT_SRV /payment/get/ id, CommonResult.class, id);if(entity.getStatusCode().is2xxSuccessful()){return entity.getBody();}else{return new CommonResult(444,操作失败);}}} 四、Ribbon 核心组件 IRule 4.1 默认的负载均衡算法 IRule 是负载均衡顶级的父接口它会根据特定的算法从服务列表中选取一个要访问的服务它的实现类它的类图如下所示 IRule 接口现有的实现类即默认存在的负载均衡策略如下 1、com.netflix.loadbalancer.RoundRobinRule轮询默认 2、com.netflix.loadbalancer.RandomRule随机 3、com.netflix.loadbalancer.RetryRule先按照 RoundRobinRule 的策略获取服务如果获取服务失败则在指定时间内会进行重试获取可用的服务。 4、WeightedResponseTimeRule对 RoundRobinRule 的扩展响应速度越快的实例选择权重越大越容易被选择。 5、BestAvailableRule会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务然后选择一个并发量最小的服务。 6、AvailabilityFilteringRule先过滤掉故障实例再选择并发较小的实例 7、ZoneAvoidanceRule默认规则复合判断 server 所在区域的性能和 server 的可用性选择服务器。 4.2 替换默认负载均衡算法 4.2.1 配置细节 我们需要新建一个自定义配置类来替换默认的负载均衡算法但是官方文档明确给出了警告这个自定义配置类不能放在 ComponentScan 所扫描的当前包下以及子包下否则我们自定义的这个配置类就会被所有的 Ribbon 客户端所共享达不到特殊化定制的目的了。 我们在 cloud-consumer-order80 模块上进行配置现在的项目结构如下所示 我们如果想要自定义一个配置类就需要重新创建一个包且这个包不被 Spring 扫描到如下图 4.2.2 创建配置类 在 myrule 包下创建自定义配置类 MySelfRule代码如下所示 Configuration public class MySelfRule {Beanpublic IRule myRule(){// 定义一个随机类型的负载均衡算法return new RandomRule();} }4.2.3 修改主启动类 在主启动类上添加注解并指定负载均衡的类型和服务的名称如下 SpringBootApplication EnableEurekaClient RibbonClient(name CLOUD-PAYMENT-SERVICE,configuration MySelfRule.class) public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class,args);} } 4.2.4 测试 分别启动 cloud-eureka-server7001、cloud-eureka-server7002、cloud-provider-payment8001、cloud-provider-payment8002 和 cloud-consumer-order80 模块然后不断的刷新请求地址 http://localhost/consumer/payment/get/1如下图 五、Ribbon 负载均衡算法 5.1 原理 轮询负载均衡算法rest 接口第几次请求数 % 服务器集群总数量 实际调用服务器位置下标 每次服务重启动后 rest 接口计数从 1 开始。 以 8081 和 8082 组合成集群为例一共两台机器集群总数量为 2 按照轮询的算法原理 1、当总请求数为 1 时 1 % 2 1 对应下标位置为 1 则获得服务地址为 127.0.0.1:8001 2、当总请求数位 2 时 2 % 2 0 对应下标位置为 0 则获得服务地址为 127.0.0.1:8002 3、当总请求数位 3 时 3 % 2 1 对应下标位置为 1 则获得服务地址为 127.0.0.1:8001 4、 当总请求数位 4 时 4 % 2 0 对应下标位置为 0 则获得服务地址为 127.0.0.1:8002 以此类推。 5.2 手写负载均衡算法 接下来我们手写一个轮询类型的负载均衡算法。 首先在 cloud-provider-payment8001 和 cloud-provider-payment8002 模块的 PaymentController 类中添加如下的方法用于后续的测试 GetMapping(value /payment/lb) public String getPaymentLB() {return serverPort; } 然后把 cloud-consumer-order80 模块的 ApplicationContextConfig 类的负载均衡的注解注释掉如下 Configuration public class ApplicationContextConfig {Bean//使用LoadBalanced注解赋予RestTemplate负载均衡的能力// LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();} }在 cloud-consumer-order80 模块中创建一个接口和实现类用来实现轮询的负载均衡如下 package com.springcloud.lb;import org.springframework.cloud.client.ServiceInstance;import java.util.List;public interface LoadBalancer {// 从服务器集群中选择一台来处理请求ServiceInstance instances(ListServiceInstance serviceInstances); }package com.springcloud.lb;import org.springframework.cloud.client.ServiceInstance; import org.springframework.stereotype.Component;import java.util.List; import java.util.concurrent.atomic.AtomicInteger;Component public class MyLB implements LoadBalancer{// 创建一个原子类来记录服务调用的次数private AtomicInteger atomicInteger new AtomicInteger(0);public final int getAndIncrement(){int current;int next;do{// 获取当前的调用次数的值current this.atomicInteger.get();// 获取下一次调用次数的值若值大于 Integer 的最大值则重新开启计数next current 2147483647 ? 0 : current 1;// 自旋锁,current 为当前值next 为期望值如果不满足这个条件则一直自旋使用 CAS 保证线程安全}while(!this.atomicInteger.compareAndSet(current,next));System.out.println(***********next 第几次调用next);return next;}Overridepublic ServiceInstance instances(ListServiceInstance serviceInstances) {// 用当前调用次数的下标除以集群的数量然后取余数int index getAndIncrement() % serviceInstances.size();// 最终确定由集群的哪台机器处理请求return serviceInstances.get(index);} }修改 cloud-consumer-order80 模块的 OrderController 类的代码使其调用方法时采用我们指定的负载均衡的策略代码如下 RestController Slf4j public class OrderController {Resourceprivate RestTemplate restTemplate;// public static final String PaymentSrv_URL http://localhost:8001;public static final String PAYMENT_SRV http://CLOUD-PAYMENT-SERVICE;GetMapping(/consumer/payment/create)public CommonResult create(Payment payment){// 客户端用浏览器是get请求但是底层实质发送post调用服务端8001return restTemplate.postForObject(PAYMENT_SRV/payment/create,payment,CommonResult.class);}// 返回对象为响应体中数据转化成的对象基本上可以理解为JsonGetMapping(/consumer/payment/get/{id})public CommonResult getPayment(PathVariable Long id){return restTemplate.getForObject(PAYMENT_SRV /payment/get/id, CommonResult.class, id);}Resourceprivate LoadBalancer loadBalancer;Resourceprivate DiscoveryClient discoveryClient;GetMapping(/consumer/payment/lb)public String getPaymentLB(){// 获取集群上所有可用的节点ListServiceInstance instances discoveryClient.getInstances(CLOUD-PAYMENT-SERVICE);if(instances null || instances.size()0) {return null;}// 选择具体由哪台机器干活ServiceInstance serviceInstance loadBalancer.instances(instances);URI uri serviceInstance.getUri();// 干活return restTemplate.getForObject(uri/payment/lb,String.class);} } 接下来进行测试启动各个模块在浏览器输入 http://localhost/consumer/payment/lb如下图可以看到刷新一次浏览器界面显示的都会发生有规则的变化。 控制台的后台打印内容如下
http://www.hkea.cn/news/14395658/

相关文章:

  • 小米手表网站乐清 网站建设
  • 元谋网站建设地方网站模板
  • 做番号类网站违法吗统一门户登录
  • 关键词 网站网页设计教程入门
  • 抖音同城推广南昌seo招聘
  • 如何创建自己的网站链接深圳英文网站建设专业公司
  • 短视频网站开发教程广州白云区最新信息
  • 重庆seo网站收录优化丽水专业网站建设公司
  • 招聘网站套餐工程造价建设信息网站
  • 怎样推广网站平台wordpress专题
  • 公关做的好的网站seo网站项目讲解
  • 龙泉驿网站建设wordpress网站加密
  • 加强 廉政网站建设企业商城网站开发
  • 网站功能报价wordpress 前台关闭
  • 中外商贸网站建设中英互译网站怎么做
  • 义乌做公司网站国外 网站页面
  • 宁波网站建设设计公司信息电脑游戏排行榜2020前十名
  • 定制网站大概多少钱网站推广站点建设与策划
  • 网站建设空间空间有几种类型手机免费个人网站建站
  • 刘强东自己做网站临沂百度公司地址
  • 手表到哪个网站买网站的动画效果代码大全
  • 石家庄移动端网站建设做黑彩网站能赚钱吗
  • 万和城网站wordpress如何正常打开二级菜单
  • 领动营销网站建设wordpress登录按钮
  • 德州哪里有做网站的WordPress句子主题
  • 自适应型网站建设怎么做淘宝优惠券的网站
  • 三河网站建设-七天网络百度模板网站模板
  • 做网站前需要准备什么软件wordpress metaslider
  • 网站系统升级需要多久怎么做抽奖网站
  • 做pos机网站有必要么技术支持上海网站建设