2 服务消费者
RestTemplate + Ribbon
ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
server:
port: 9002
spring:
application:
name: CLIENT02
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8888/eureka/
在工程的启动类中,通过@EnableDiscoveryClient
向服务中心注册;并且向程序的ioc注入一个bean: restTemplate
;并通过@LoadBalanced
注解表明这个restRemplate开启负载均衡
的功能。
Application.main
@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan(basePackages = {"com.jf.service"})
public class CloudServiceApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
Service
@Service
public class TestService {
@Autowired
RestTemplate restTemplate;
public String hiService(String name) {
return restTemplate.getForObject("http://CLIENT01/test?name=" + name, String.class);
}
}
Controller
@Autowired
TestService testService;
@RequestMapping(value = "/hi")
public String hi(@RequestParam String name) {
return testService.hiService(name);
}
这说明当我们通过调用restTemplate.getForObject(“http://CLIENT01/hi?name=“+name, String.class)方法时,已经做了负载均衡,访问了不同的端口的服务实例。
架构:
- 一个服务注册中心,eureka server,端口为8888
- CLIENT01工程跑了两个实例,端口分别为9001,9000,分别向服务注册中心注册
- CLINET02端口为9002,向服务注册中心注册
- 当CLINET02通过restTemplate调用CLIENT01的hi接口时,因为用ribbon进行了负载均衡,会轮流的调用CLIENT01:9001,9000 两个端口的hi接口
通过启动参数传入进去,可以用配置 VM参数 -Dserver.port=9000
的方式来启动不同实例
或者更改端口通过IDEA再次启动项目
Feign
Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。
简而言之:
- Feign 采用的是基于接口的注解
- Feign 整合了ribbon
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
在工程的启动类中,通过@EnableFeignClients
向服务中心注册
Application.main
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
@ComponentScan(basePackages = {"com.jf.freign"})
public class CloudFeignApplication {
定义一个feign接口,通过@FeignClient
(服务名),来指定调用哪个服务
@FeignClient(value = "CLIENT01")
public interface SchedualService {
@GetMapping("/test")
public String test(@RequestParam("name") String name);
}
test方法-参数前@RequestParam
必须要加上,否则会报错
controller
@RestController
public class TestController {
@Autowired
private SchedualService schedualService;
@GetMapping("/hi")
public String hi(String name) {
return schedualService.test(name);
}
}