spring-cloud调用服务有两种方式,一种是Ribbon+RestTemplate, 另外一种是Feign。
Ribbon是一个基于HTTP和TCP客户端的负载均衡器,类似nginx反向代理,可以很好的控制htt和tcp的一些行为。Feign默认集成了ribbon(即不用添加ribbon的jar包也能使用ribbon负载均衡),只要使用@FeignClient时,ribbon就会自动使用。ribbon负载均衡默认使用轮询策略,即多个服务依次轮回调用。
springcloud调用服务的底层原理:
客户端、服务端想注册中心注册服务,注册中心登记了服务的ip,端口号和服务名,当有客户端调用服务时,通过HttpClient技术获取服务的接口信息。
前提:
客户端:service-a
server:
port: 8081
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka
spring:
application:
name: service-a
服务端:service-a
server:
port: 8082
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka
spring:
application:
name: service-b
一、Ribbon+REST(不常用)
1、在客户端添加依赖包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
2、在客户端启动类中注册RestTemplate,并使用@LoadBalanced开启负载功能
@EnableEurekaClient
@SpringBootApplication
public class ServiceAApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceAApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}
3、在客户端系统中写一个测试controller
@RestController public class TestController { @Autowired RestTemplate restTemplate; @RequestMapping("/hi") public String hi(@RequestParam String id){ return restTemplate.getForObject("http://service-b/hi?id="+id, String.class); } }
4、在服务端系统中提供一个hi()方法,供客户端调用
@EnableEurekaClient @RestController @SpringBootApplication public class ServiceBApplication { public static void main(String[] args) { SpringApplication.run(ServiceBApplication.class, args); } @Value("${spring.application.name}") private String name; @Value("${server.port}") private String port; @RequestMapping("/hi") public String hi(@RequestParam String id){ return "hi, " + id + ", " + name + ":" + port; } }
5、重新启动客户端和服务端
6、测试,浏览器访问
http://localhost:8081/hi?id=123
返回结果:
hi, 123, service-b:8082
二、feign(常用)
1、在客户端添加依赖包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>
2、在客户端启动类中使用@EnableFeignClients开启feiginClient功能
@EnableEurekaClient @EnableFeignClients @SpringBootApplication public class ServiceAApplication { public static void main(String[] args) { SpringApplication.run(ServiceAApplication.class, args); } }
3、新建一个ServiceAFeignClient接口调用service-b的服务
package com.example.servicea; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Component @FeignClient(value = "service-b") //这里的name对应调用服务的spring.applicatoin.name public interface ServiceAFeignClient { @RequestMapping(value = "/hi") String hi(@RequestParam("id") String id); }
4、在客户端系统中写一个测试controller
@RestController public class TestController { @Autowired ServiceAFeignClient serviceAFeignClient; @RequestMapping("/hi") public String hi(@RequestParam String id){ return serviceAFeignClient.hi(id); } }
运行后的结果应该是和ribbon的相同。个人感觉使用feign比较舒服,代码比较简洁。
作者:架构师小跟班
开发者导航: http://www.codernav.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果文中有什么错误,欢迎指出,以免更多的人被误导。