手心输入法怎么打符号(手心输入法使用步骤)

手心输入法怎么打符号(手心输入法使用步骤)

SpringCloud RibbonRibbon 介绍

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。简单地说,Ribbon是一个客户端负载均衡器。

开发准备

开发环境

JDK:1.8

SpringBoot:2.1.1.RELEASE

SpringCloud:Finchley

注:不一定非要用上述的版本,可以根据情况进行相应的调整。需要注意的是SpringBoot2.x以后,jdk的版本必须是1.8以上!

确认了开发环境之后,我们再来添加相关的pom依赖。

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies>

注:基于SpringBoot1.x以上SpringCloud是Dalston版本的eureka 依赖是spring-cloud-starter-eureka,feign 依赖是spring-cloud-starter-ribbon,少了个 netflix 。SpringCloud的版本命名方式是通过伦敦的地方来命名的,版本顺序是根据首字母的顺序来的。

SpringCloud Ribbon 示例服务端

首先建立一个springcloud-ribbon-eureka服务的工程,用于做注册中心。配置和代码之前的基本一样,除了端口和打印信息,这里就不在说明了。

客户端

这里我们定义三个服务,一个服务使用Ribbon做负载均衡,另外两个做普通的服务,服务名称依次为springcloud-ribbon-consumer、springcloud-ribbon-consumer2和springcloud-ribbon-consumer3。添加如上的依赖之后,在application.properties添加如下的配置:

consumer 配置信息:

spring.application.name=springcloud-ribbon-consumerserver.port=9006eureka.client.serviceUrl.defaultZone=http://localhost:8003/eureka/

consumer2 配置信息:

spring.application.name=springcloud-ribbon-consumer2server.port=9007eureka.client.serviceUrl.defaultZone=http://localhost:8003/eureka/

consumer3 配置信息:

这里的服务名称和另一个服务的名称保持一致才能实现负载均衡功能。

spring.application.name=springcloud-ribbon-consumer2server.port=9008eureka.client.serviceUrl.defaultZone=http://localhost:8003/eureka/

配置说明:

server.port:服务指定的端口。

springcloud-ribbon-consumer

使用Ribbon实现负载均衡,只需要在启动类中实例化RestTemplate,通过@LoadBalanced注解开启均衡负载能力.。

启动类代码示例:

@SpringBootApplication@EnableDiscoveryClientpublic class RibbonConsumerApplication {publicstaticvoidmain(String[] args) {SpringApplication.run(RibbonConsumerApplication.class, args);System.out.println(“ribbon第一个消费者服务启动…”);}@Bean@LoadBalancedpublicRestTemplaterestTemplate() {returnnewRestTemplate();}}

需要定义转发的服务,这里使用RestTemplate来进行调用,调用另外一个服务的名称。

转发类代码示例:

@RestControllerpublicclassConsumerController {@AutowiredRestTemplate restTemplate;@RequestMapping(“/hello”)publicStringhello() {//进行远程调用returnrestTemplate.getForObject(“http://springcloud-ribbon-consumer2/hello/?name=xuwujing”,String.class);}}

springcloud-ribbon-consumer2和springcloud-ribbon-consumer3代码基本和fegin中的springcloud-feign-consumer一样,因此这里就不在贴代码了。

功能测试

完成如上的工程开发之后,我们依次启动服务端和客户端的四个程序,然后在浏览器界面输入: http://localhost:8003/,即可查看注册中心的信息。

在浏览器输入:

http://localhost:9006//hello

然后进行重复访问,返回如下结果:

xuwujing,Hello World!xuwujing,Hello World! 这是另一个服务!xuwujing,Hello World!xuwujing,Hello World! 这是另一个服务!xuwujing,Hello World!xuwujing,Hello World! 这是另一个服务!

说明已经实现了负载均衡功能了。

我们从上述的结果中发现了一点,这个调用貌似是有规律的,两个服务进行来回调用。那么根据这个我们发现了,负载均衡是由策略的。上述的这个示例的策略就是其中的一个RoundRobinRule轮询策略。

这里就顺便说下Ribbon的策略,Ribbon一共有7中策略,默认使用的策略是轮询。策略说明如下表格:

策略名策略声明策略描述实现说明BestAvailableRulepublic class BestAvailableRule extends ClientConfigEnabledRoundRobinRule选择一个最小的并发请求的server逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的serverAvailabilityFilteringRulepublic class AvailabilityFilteringRule extends PredicateBasedRule过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态WeightedResponseTimeRulepublic class WeightedResponseTimeRule extends RoundRobinRule根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成status时,使用roubine策略选择server。RetryRulepublic class RetryRule extends AbstractLoadBalancerRule对选定的负载均衡策略机上重试机制。在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的serverRoundRobinRulepublic class RoundRobinRule extends AbstractLoadBalancerRuleroundRobin方式轮询选择server轮询index,选择index对应位置的serverRandomRulepublic class RandomRule extends AbstractLoadBalancerRule随机选择一个server在index上随机,选择index对应位置的serverZoneAvoidanceRulepublic class ZoneAvoidanceRule extends PredicateBasedRule复合判断server所在区域的性能和server的可用性选择server使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。

这里也顺便说明如何指定一个策略使用方法。

最简单的方式

在application.properties添加如下配置:

springcloud-ribbon-consumer2.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

该配置的意思是为springcloud-ribbon-consumer2服务指定随机策略。

另一种方式

新建一个类,通过@Bean注解指定策略。

@ConfigurationpublicclassRibbonConfiguration{@BeanpublicIRuleribbonRule(){returnnewRandomRule();}}

然后再通过@RibbonClien注解指定服务。

@RibbonClient(name=”springcloud-ribbon-consumer2″, configuration=RibbonConfiguration.class)public class HelloRibbon{}

注: 如果有的服务没有在Eureka进行注册,可以使用ribbon.listOfServers方式在配置文件中来指定服务。

例如:

springcloud-ribbon-consumer2.ribbon.listOfServers:localhost:9007,localhost:9008

访问的结果如下:

xuwujing,Hello World!xuwujing,Hello World! 这是另一个服务!xuwujing,Hello World! 这是另一个服务!xuwujing,Hello World!xuwujing,Hello World!xuwujing,Hello World!

可以看到已经成功实现了随机访问的策略!

SpringCloud Fegin结合Ribbon实现负载均衡

Fegin包含了Ribbon,可以直接实现负载均衡功能。这里我们就在Ribbon的项目稍微进行改造下实现该功能。

首先在pom文件添加Fegin的依赖包。

org.springframework.cloudspring-cloud-starter-openfeign

然后在springcloud-ribbon-consumer项目的启动类上添加@EnableFeignClients注解,启用feign进行远程调用。

添加完成之后,新建一个类,实现feign远程调用。

代码如下:

@FeignClient(name=”springcloud-ribbon-consumer2″)public interface HelloRemote {@RequestMapping(value =”/hello”)public String hello(@RequestParam(value =”name”) String name);}

最后在提供一个新的接口供外部调用。这里就直接在之前的代码上新加一个接口了。代码如下:

@RestControllerpublic class ConsumerController {@AutowiredRestTemplate restTemplate;@RequestMapping(“/hello”)public String hello() {returnrestTemplate.getForObject(“http://springcloud-ribbon-consumer2/hello/?name=xuwujing”, String.class);}@AutowiredHelloRemotehelloRemote;@RequestMapping(“/hello/{name}”)publicStringindex(@PathVariable(“name”) String name) {System.out.println(“接受到请求参数:” name “,进行转发到其他服务!”);returnhelloRemote.hello(name);}}

访问的结果如下:

pancm,Hello World!pancm,Hello World! 这是另一个服务!pancm,Hello World!pancm,Hello World! 这是另一个服务!pancm,Hello World!pancm,Hello World! 这是另一个服务!

示例图:

精彩推荐

JDK1.8源码分析:Executors线程池创建工厂的用法和实现原理

JDK1.8源码分析:可重入锁ReentrantLock和Condition的实现原理

Tomcat源码分析:Socket网络通信和线程模型体系结构设计

Spring的三种依赖注入方式的使用和源码实现分析

发表评论

登录后才能评论