在微服务架构中,业务都会被拆分红一个独立的服务,服务与服务的通信是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另外一种是feign。html
Ribbon is a client-side load balancer that gives you a lot of control over the behavior of HTTP and TCP clients. Feign already uses Ribbon, so, if you use @FeignClient, this section also applies.
-- 官方文档java
ribbon是一个负载均衡客户端,能够很好的控制htt和tcp的一些行为。Feign默认集成了ribbon。web
从新新建一个maven工程,取名为:service-ribbon;
在它的pom.xml继承了父pom文件,并引入了如下依赖:spring
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>sc-f-chapter2</artifactId> <groupId>com.tugohost</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.tugohost</groupId> <artifactId>service-ribbon</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> </dependencies> </project>
目录结构:
apache
在工程的配置文件指定服务的注册中心地址为http://localhost:8761/eureka/,程序名称为 service-ribbon,程序端口为8764。配置文件application.yml
以下:浏览器
eureka: client: service-url: default-zone: http://localhost:8761/eureka/ server: port: 8764 spring: application: name: service-ribbon
在工程的启动类中,经过@EnableDiscoveryClient向服务中心注册;而且向程序的ioc注入一个bean: restTemplate;并经过@LoadBalanced注解代表这个restRemplate开启负载均衡的功能。restful
/** * @author: Tu9ohost */ @SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient public class ServiceRibbonApplition { public static void main(String[] args) { SpringApplication.run(ServiceRibbonApplition.class,args); } @Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); } }
写一个测试类HelloService,经过以前注入ioc容器的restTemplate来消费service-hi服务的“/hi”接口,在这里咱们直接用的程序名替代了具体的url地址,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名,代码以下:架构
/** * @author: Tu9ohost */ @Service public class HelloService { @Autowired RestTemplate restTemplate; public String helloService(String name){ return restTemplate.getForObject("http://SERVICE-HI/hello?name="+name,String.class); } }
写一个controller,在controller中用调用HelloService 的方法,代码以下:app
/** * @author: Tu9ohost */ @RestController public class HelloController { @Autowired HelloService helloService; @GetMapping(value = "/hello") public String hello(@RequestParam String name){ return helloService.helloService(name); } }
在浏览器上屡次访问http://localhost:8764/hi?name=forezp,浏览器交替显示:负载均衡
hi forezp,i am from port:8762
hi forezp,i am from port:8763
这说明当咱们经过调用restTemplate.getForObject(“http://SERVICE-HI/hi?name=”+name,String.class)方法时,已经作了负载均衡,访问了不一样的端口的服务实例。