@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随机负载均衡
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)