版权声明:个人随笔,只为保存文档,希望能对你有帮助,如需转载、修改请保留本人CSDN链接! https://blog.csdn.net/w893932747/article/details/86287718
注册的服务之间是怎么调用的。传统的一个项目当中,通常会有系统管理、用户管理、角色管理、人员管理等等这些模块,在分布式的系统当中,以往的同一个项目里的每一个功能模块可以相应独立拆分成一个项目也就是一个服务,然后这些服务在服务中心注册,服务与服务之间不直接调用,而通过服务中心来调用。
Spring cloud 服务间调用一般有两种方式,
- 第一种:ribbon+restTemplate
- 第二种:fegin
第一种ribbon+restTemplate:
Ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为。
Feign默认集成了ribbon。
创建项目就不创建了直接给出启动类的方法。
@SpringBootApplication
@EnableEurekaClient
@RestController
public class RibbonServiceApplication {
public static void main(String[] args) {
SpringApplication.run(RibbonServiceApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/hello")
public String hello(String name) {
String result=restTemplate.getForObject("http://client-service/hello?name=" + name, String.class);
// String result="result"+name;
return result;
}
}
启动两个client,端口号不能相同,name必须相同,多次访问可以看到端口号是来两个端口号间来回跳动。
这说明当我通地调用restTemplate.getForObject(http://HELLOSERVICE/hello?name=+zhangsan,String.class)方法时,已经作了负载均衡,访问了不同端口的服务实例。
第二种方法feign:
新建一个lisiService,通过feign的方法去调用上一篇文章在服务注册中心注册的helloService。
Feign是一个声明式的伪http客户端,它使得写http客户端变得更简单,使用fegin,只需要创建一个接口,并注解,它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@RestController
public class LisiServiceApplication {
public static void main(String[] args) {
SpringApplication.run(LisiServiceApplication.class, args);
}
@FeignClient("helloService")
public interface HelloService {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello(@RequestParam("name") String name);
}
@Autowired
private HelloService helloService;
@RequestMapping("/hello")
public String hello(@RequestParam("name")String name){
return helloService.hello(name);
}
这里边存在一个问题不知道你们发现没有,就是两个服务间切换的时候如果一个服务停止了,会报错,这个就需要用到断路器。