@SpringBootApplication
public class ConsumerApplication {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
@LoadBalanced
public RestTemplate loadBalanceRestTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
2.控制类代码:
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
//打开浏览器
//访问:http://localhost:8090/consumer/doRestEcho1
@GetMapping("/consumer/doRestEcho1")
public String doRestEcho1(){
String url="http://localhost:8081/provider/echo/8090";
return restTemplate.getForObject(url,//远端服务的url
String.class);//远端服务url对应的返回值类型(ResponseType)
}
@Autowired
private LoadBalancerClient loadBalancerClient;//RibbonLoadBalancerClient
@Value("${spring.application.name:8090}")
private String appName;
//Consumer-->Provider
//访问http://localhost:8090/consumer/doRestEcho2
@GetMapping("/consumer/doRestEcho2")
public String doRestEcho2(){
//1.基于服务名获取服务实例
ServiceInstance serviceInstance = //alt+回车 可以生成变量
loadBalancerClient.choose("sca-provider");//serviceId为nacos中的服务名
//2.基于服务实例构建要访问的服务的url
String ip=serviceInstance.getHost();
int port=serviceInstance.getPort();
//String url="http://"+ip+":"+port+"/provider/echo/8090";
String url=String.format("http://%s:%s/provider/echo/{msg}",ip,port);
//String url=String.format("http://%s:%s/provider/echo/{msg}",ip,port,appName);
return restTemplate.getForObject(url,//远端服务的url
String.class,appName);//远端服务url对应的返回值类型(ResponseType)
}
@Autowired
private RestTemplate loadBalanceRestTemplate;
@GetMapping("/consumer/doRestEcho3")
public String doRestEcho3(){
String url=String.format("http://%s/provider/echo/{msg}","sca-provider");
return loadBalanceRestTemplate.getForObject(url,String.class,appName);
}
}
3.分析
第一部分
1.restTemplate在此处引用, 需要提前在启动类中交给spring容器管理,具体实现:
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
2.restTemplate.getForObject()方法, 主要用来访问远端服务器,其中需要的三个参数中
url:远端服务器访问地址
responseType:远端服务器接收请求后的返回值类型
uriVariavbles:可变参数类型,可省略,在三部分中,会用到
控制类中:
1.控制类中,自动注入了loadBalancerClient,而且不需要再启动类手动交给spring容器管理
ServiceInstance serviceInstance =loadBalancerClient.choose(“sca-provider”): 通过服务名获取服务实例,所获 取的对象中有两个方法可分别用于获取地址和端口号:
String ip=serviceInstance.getHost(); int port=serviceInstance.getPort();
2.String url=String.format(“http://%s:%s/provider/echo/{msg}”,ip,port)
此方法用来拼接string字符串%s表示占一串字符串的位置,其后的参数分别替换第一个%s和第二个%s
3.具体的请求
return restTemplate.getForObject(url, String.class,appName);
第三个参数用来表示可变参数的传参,可给{msg}传参.
第三部分启动类中:
1.@LoadBalanced与@bean同时注解修饰RestTemplate的时候, 此时RestTemplate的容器对象具备了负载均衡的功能,由此创建的对象默认通过负载均衡的方式来访问远程服务器
2.若更改默认的负载均衡方式可在apllication.yml中修改(以后将写在配置中心),例如:RandomRule随机负载均衡



