以下是个人理解,仅供参考
eureka获取ip和端口的方法
@GetMapping("test")
public String Test(String serverName){
List<ServiceInstance> instances = discoveryClient.getInstances(serverName);
ServiceInstance serviceInstance = instances.get(0);
String ip = serviceInstance.getHost();
int port = serviceInstance.getPort();
System.out.println(ip+port);
return ip+port;
}
有了ip和端口就可以通过RestTemplate类访问对应的服务了
ribbon做了什么?
@Bean
@LoadBalanced
public RestTemplate RestTemplate(){
return new RestTemplate();
}
@GetMapping("test")
public String A(String serverName){
String str = restTemplate.getForObject("http://" + serverName+ "/hello", String.class);
return str;
}
可以看到只需要为RestTemplate类加入@LoadBalanced注解,就可以用eureka中的application名称代替写死的端口和ip
其实ribbon在底层代理了RestTemplate类,它会拦截你的请求分析出请求中的serverName,在底层通过discoveryClient类和serverName获得eureka中对应application的instance列表,并且以指定的方式进行负载均衡
ribbon的作用在此可以看出是一个承上启下的角色,它的上面是eureka,它的下面是负载均衡.
feign做了什么?
@FeignClient(value = "user-server")
public interface UserOrderFeign {
@GetMapping("order")
String order();
}
feign的代码很简单,在接口上加入注解vaue是eureka中的appliction名称,接口中则是服务提供则的方法原型,这样就可以发起远程调用了,这种操作方式极大的简化了开发.
feign修饰的是一个接口,接口不能做事做事的是对象,很容易想到,feign用了动态代理在底层实现了该接口的对象.在代理的底层,feign首先找到被注解修饰的接口,拿到它上面@FeignClient注解中的vuele,这个value是eureka的applicaton名称,通过这一步feign借助ribbon可以找到eureka中的服务实例,即拿到了同一application服务的instance集合同时也算知道了ip+端口的集合.
接口中的方法注解@GetMapping(“order”)则告知了我们服务的api,这样feign就可以实现负载均衡的远程调用了.
例子:
1.feign通过@FeignClient(value = “user-server”)得到了eureka中的服务
8081和8082是eureka中application名称为user-server的2个instance
2.@GetMapping(“order”)为我们提供了访问该实例的api,feign底层封装的ribbon让我们负载均衡的访问8081和8082.