SpringCloud-服务的消费者(rest+ribbon)
在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring Cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign,先来说下ribbon+rest
Ribbon简介
Ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为。Feign默认集成了ribbon
实现负载均衡,我们可以通过服务器端和客户端做负载均衡。服务器端做负载均衡,可以使用Nginx。而客户端做负载均衡,就是客户端有一个组件,知道有哪些可用的微服务,实现一个负载均衡算法。Ribbon工作流程主要分为两步:第一:先选择Eureka Server,优先选择在同一个Zone且负载较少的Server第二:再根据用户指定的策略,再从server取到的服务注册列表中选择一个地址。其中Ribbon提供了很多种策略,例如轮询round bin ,随机random,很具响应时间加权
Ribbon已经默认实现了这些配置bean
IClientConfig ribbonClientConfig: DefaultClientConfigImplIRule ribbonRule: ZoneAvoidanceRuleIPing ribbonPing: NoOpPingServerList ribbonServerList: ConfigurationBasedServerListServerListFilter ribbonServerListFilter: ZonePreferenceServerListFilterILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer项目创建
新建一个Eureka Client项目
pom文件如下
4.0.0 com.SpringCloud service-ribbon 0.0.1-SNAPSHOT jar service-ribbon service-ribbon-description org.springframework.boot spring-boot-starter-parent 1.5.13.RELEASE UTF-8 UTF-8 1.8 Edgware.SR3 org.springframework.cloud spring-cloud-starter-eureka org.springframework.cloud spring-cloud-starter-ribbon org.springframework.cloud spring-cloud-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import org.springframework.boot spring-boot-maven-plugin
application.yml如下
spring: application: name: service-ribbonserver: port: 8764eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
项目启动类修改如下
@EnableDiscoveryClient@SpringBootApplicationpublic class ServiceRibbonApplication { public static void main(String[] args) { SpringApplication.run(ServiceRibbonApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); }}
新建测试service
@Servicepublic class HelloService { @Autowired RestTemplate restTemplate; public String hiService(String name) { return restTemplate.getForObject("http://eureka-client/hello?name=" + name, String.class); }}
新建测试controller
@RestControllerpublic class HelloController { @Autowired HelloService helloService; @RequestMapping("/hi") public String hi(@RequestParam String name) { return helloService.hiService(name); }}
浏览器访问
http://localhost:8764/hi?name=test
可看到以下效果