这篇文章给大家分享的是有关SpringCloud中怎么使用Ribbon和RestTemplate实现服务调用和负载平衡的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

SpringCloud 是目前微服务架构领域的翘楚,备受开发者和企业的青睐。

文件目录结构

文件目录结构很重要,特别注意的是rule文件要放在主启动类上一级位置,才能够扫描。

写pom

<dependencies><!--springboot2.2.2--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--SpringcloudHoxton.SR1--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--Springcloudalibaba2.1.0.RELEASE--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--Eureka-Client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

因为eureka的依赖已经整合了ribbon的依赖,所以不用额外引入新的东西。

改yml

server:port:80spring:application:name:cloud-book-consumereureka:client:register-with-eureka:falsefetch-registry:trueservice-url:defaultZone:http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka主启动

@SpringBootApplication@EnableEurekaClient@RibbonClient(name="CLOUD-BOOK-SERVICE",configuration=LoadBalanceRule.class)//更换轮询算法publicclassRestTemplateMain80{publicstaticvoidmain(String[]args){SpringApplication.run(RestTemplateMain80.class,args);}}业务逻辑rules层

在图示文件目录下新建LoadBalanceRule.class,用于更换负载均衡算法。

@ConfigurationpublicclassLoadBalanceRule{@BeanpublicIRuleiRule(){//定义为随机returnnewRandomRule();}}config层

开启restTemplate负载均衡
在config文件夹下创建LoadBalanceConfig.class

@ConfigurationpublicclassLoadBalanceConfig{@Bean@LoadBalanced//开启负载均衡publicRestTemplategetReatTemplate(){returnnewRestTemplate();}}controller层

新建BookController.class
写业务代码

@RestController@Slf4jpublicclassBookController{@ResourceprivateRestTemplaterestTemplate;publicstaticfinalStringPAYMENT_URL="http://CLOUD-BOOK-SERVICE";@GetMapping(value="restTemplate/book/getAllBooks")//只要json数据时publicCommonResultgetAllBooks(){returnrestTemplate.getForObject(PAYMENT_URL+"/book/getAllBooks",CommonResult.class);}@GetMapping("restTemplate/book/getAllBooks2")//需要知道更多数据时,使用getForEntity方法publicCommonResultgetAllBooks2(){ResponseEntity<CommonResult>resultResponseEntit=restTemplate.getForEntity(PAYMENT_URL+"/book/getAllBooks",CommonResult.class);if(resultResponseEntit.getStatusCode().is2xxSuccessful()){log.info(resultResponseEntit.getStatusCode()+""+resultResponseEntit.getHeaders());returnresultResponseEntit.getBody();}else{returnnewCommonResult<>(444,"操作失败");}}@GetMapping(value="restTemplate/book/index")publicStringindex(){returnrestTemplate.getForObject(PAYMENT_URL+"/book/index",String.class);}}

使用restTemplate+Ribboin实现服务调用和负载均衡完成。

手写Ribbon负载均衡算法 lb层1.新建LoadBalancer接口,添加代码

publicinterfaceLoadBalancer{ServiceInstanceinstances(List<ServiceInstance>serviceInstances);}2.新建实现类MyLB

@ComponentpublicclassMyLBimplementsLoadBalancer{privateAtomicIntegeratomicInteger=newAtomicInteger(0);//求第几次访问自旋锁思想publicfinalintgetAndIncrement(){intcurrent;intnext;do{current=this.atomicInteger.get();next=current>=2147483647?0:current+1;}while(!this.atomicInteger.compareAndSet(current,next));System.out.println("***第几次访问next->"+next);returnnext;}//负载均衡算法,实现roundRobin算法@OverridepublicServiceInstanceinstances(List<ServiceInstance>serviceInstances){intindex=getAndIncrement()%serviceInstances.size();returnserviceInstances.get(index);}}修改BookController

@RestController@Slf4jpublicclassBookController{@ResourceprivateRestTemplaterestTemplate;@ResourceprivateLoadBalancerloadBalancer;@ResourceprivateDiscoveryClientdiscoveryClient;publicstaticfinalStringPAYMENT_URL="http://CLOUD-BOOK-SERVICE";@GetMapping(value="restTemplate/book/getAllBooks")//只要json数据时publicCommonResultgetAllBooks(){List<ServiceInstance>instances=discoveryClient.getInstances("CLOUD-BOOK-SERVICE");if(instances==null||instances.size()<=0){returnnull;}ServiceInstanceserviceInstance=loadBalancer.instances(instances);URIuri=serviceInstance.getUri();returnrestTemplate.getForObject(uri+"/book/getAllBooks",CommonResult.class);}@GetMapping(value="restTemplate/book/index")publicStringindex(){List<ServiceInstance>instances=discoveryClient.getInstances("CLOUD-BOOK-SERVICE");if(instances==null||instances.size()<=0){returnnull;}ServiceInstanceserviceInstance=loadBalancer.instances(instances);URIuri=serviceInstance.getUri();returnrestTemplate.getForObject(uri+"/book/index",String.class);}}修改文件注解

删去主启动类的更换负载均衡算法注解

@RibbonClient(name = “CLOUD-BOOK-SERVICE”, configuration = LoadBalanceRule.class)

删去LoadBalanceConfig中开启负载均衡算法注解

@LoadBalanced

手写Ribbon算法并使用完成

感谢各位的阅读!关于“SpringCloud中怎么使用Ribbon和RestTemplate实现服务调用和负载平衡”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!