将controller配置为多服务,动态选择服务器
从consumer通过远端访问provider,从provider动态选择服务器进行服务
loadBalancerClient.choose(“sca-provider”)
占位符:%s
//访问地址:http://localhost:8090/consumer/doRestEcho2
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/consumer/doRestEcho2")
public String doRestEcho02(){
ServiceInstance serviceInstance = loadBalancerClient.choose("sca-provider");
String url = String.format("http://%s:%s/provider/echo/%s",
serviceInstance.getHost(),serviceInstance.getPort(),appName);
System.out.println("request url:"+url);
return restTemplate.getForObject(url, String.class);
}
将负载均衡拦截器注入到创建的对象中
运用@LoadBalanced注解
@Bean
@LoadBalanced//将负载均衡拦截器注入到这个对象中
public RestTemplate loadBalancedRestTemplate(){
return new RestTemplate();
}
底层运用拦截器做了负载均衡
可以将上面02代码代码进行简化
//访问地址:http://localhost:8090/consumer/doRestEcho3
@Autowired
private RestTemplate loadBalancedRestTemplate;
@GetMapping("/consumer/doRestEcho3")
public String doRestEcho03(){
String url = "http://sca-provider/provider/echo/"+appName;
return loadBalancedRestTemplate.getForObject(url, String.class);
}
Feign应用实践
第一步:添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
第二步:在启动类上添加@EnableFeignClients注解
第三步:创建service,通过service远程取调用服务
//用于定义远程调用规范,name名字作为RemoteProviderService接口实现类的Bean对象的名字
@FeignClient(name = "sca-provider")
public interface RemoteProviderService {
@GetMapping("/provider/echo/{msg}")
String echoMsg(@PathVariable("msg") String msg);
}
Feign 调用过程分析(了解)
Feign应用过程分析(底层逻辑先了解):
1)通过 @EnableFeignCleints 注解告诉springcloud,启动 Feign Starter 组件。
2) Feign Starter 在项目启动过程中注册全局配置,扫描包下所由@FeignClient注解描述的接口,然后由系统底层创建接口实现类(JDK代理类),并构建类的对象,然后交给spring管理(注册 IOC 容器)。
3) 接口被调用时被动态代理类逻辑拦截,将 @FeignClient 请求信息通过编码器生成 Request对象,基于此对象进行远程过程调用。
4) 请求对象经Ribbon进行负载均衡,挑选出一个健康的 Server 实例(instance)。
5) 通过 Client 携带 Request 调用远端服务返回请求响应。
6) 通过解码器生成 Response 返回客户端,将信息流解析成为接口返回数据。