SpringCloud系列教程04-服务调用之Ribbon 文章目录概述service-producerservice-consumerribbon/feign/http比较测试项目源码参考概述在第二篇文章SpringCloud服务调用之Feign中我们介绍了SpringCloud中使用feign进行服务调用的案例。当时还介绍了feign是基于ribbon的。这一篇我们就来看看通过原生的ribbon是怎么进行服务调用的。官方文档https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-ribbonRibbon is a client side load balancer which gives you a lot of control over the behaviour of HTTP and TCP clients. Feign already uses Ribbon, so if you are usingFeignClientthen this section also applies.ribbon可以实现服务调用和负载均衡而feign集成了ribbon。也就是说feign是基于ribbon的ribbon的调用可以理解是SpringCloud原生的服务调用。注这一篇我们基于上一篇SpringCloud服务注册之Consul中的consul来实现这么一个demo。需要consul、service-producer服务引入consul、service-consumer服务引入consul和ribbon版本SpringBoot 2.0.7.RELEASE与SpringCloud Finchely.RELEASEservice-producer服务生产者与上一节相同需要引入consul-discovery:propertiesjava.version1.8/java.versionspring-cloud.versionFinchley.RELEASE/spring-cloud.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- 引入consul用于服务注册与发现 --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-consul-discovery/artifactId/dependency!-- 健康监控 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency/dependenciesdependencyManagementdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement配置文件server:port:8200spring:application:name:service-producercloud:consul:host:localhostport:8500discovery:register:trueinstance-id:${spring.application.name}:${server.port}service-name:${spring.application.name}port:${server.port}启动类添加EnableDiscoveryClient注解packagecom.example.serviceproducer;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;SpringBootApplicationEnableDiscoveryClientpublicclassServiceProducerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ServiceProducerApplication.class,args);}}测试接口packagecom.example.serviceproducer;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;RestControllerRequestMapping(valueproducer)publicclassHelloAction{GetMapping(valuehello/{name})publicStringhello(PathVariableString name){returnHello name, this is response from hello by service-producer.;}}启动服务后测试一下service-consumer服务消费者需要引入consul-discovery和netflix-ribbon:propertiesjava.version1.8/java.versionspring-cloud.versionFinchley.RELEASE/spring-cloud.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- 引入consul用于服务注册与发现 --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-consul-discovery/artifactId/dependency!-- 健康监控 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!-- 引入ribbon --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-ribbon/artifactId/dependency/dependenciesdependencyManagementdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement配置文件与service-producer基本相同server:port:8201spring:application:name:service-consumercloud:consul:host:localhostport:8500discovery:register:trueservice-name:${spring.application.name}instance-id:${spring.application.name}:${server.port}port:${server.port}同样在启动类上添加EnableDiscoveryClient注解。下面就有所不同了还需要注入一个RestTemplate的Bean实例——这个类来自spring-boot-starter-web包packagecom.example.serviceconsumer;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;importorg.springframework.cloud.client.loadbalancer.LoadBalanced;importorg.springframework.cloud.netflix.hystrix.EnableHystrix;importorg.springframework.context.annotation.Bean;importorg.springframework.web.client.RestTemplate;SpringBootApplicationEnableDiscoveryClientpublicclassServiceConsumerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ServiceConsumerApplication.class,args);}/** * 注入RestTemplate Bean并开启负载均衡 * return */BeanLoadBalancedpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}注也可以不采用注入而在使用的时候直接new RestTemplate()。看一下我编写的测试接口packagecom.example.serviceconsumer;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.client.RestTemplate;RestControllerRequestMapping(valueconsumer)publicclassConsumerAction{AutowiredprivateRestTemplate restTemplate;GetMapping(valuetest)publicStringtest(String name){// 利用RestTemplate直接请求对应的service-name/requestString producerResrestTemplate.getForObject(http://service-producer/producer/hello/name,String.class);String resservice-consumer服务调用service-producer服务hello接口返回数据producerRes;System.out.println(res);returnres;}}上面的示例中使用了restTemplate.getForObject(http://service-producer/producer/hello/ name, String.class);来调用服务service-producer的路径为producer/hello/{name}的接口。ribbon/feign/http比较与普通的HTTP请求比较HTTP请求使用http://ip:port/path的方式请求而ribbon则使用http://service-name/path的方式。与feign请求比较FeignClient(nameservice-provider)publicinterfaceHelloRemote{GetMapping(valuehello/{name})publicStringhello(PathVariable(name)String name);}注feign的使用参考——SpringCloud系列教程02-服务调用之feignfeign是使用FeignClient来声明式地声明一个与被调用服务接口相同的接口然后直接调用这个接口。而ribbon是直接通过路径调用。测试启动service-consumer后看一下consul测试consumer服务调用producer服务至此基于ribbon进行服务调用的示例已经完成。具体可以参考下面地址的源码。项目源码https://github.com/laolunsi/spring-cloud-examples/tree/master/04-ServiceConsumeRibbon参考方志朋-服务消费者restribbon(Finchley版)https://blog.csdn.net/forezp/article/details/81040946