【springcloud】RestTemplate的三种使用方式
前期准备一个eureka server 项目,用于注册服务两个eureka client 项目,client1,client2,模拟服务间通信在client1中创建如下的controllerpackage cn.aaralyn.sellproduct.controller;import org.springframework.web.bind.annotation.GetMa...
·
前期准备
- 一个eureka server 项目,用于注册服务
- 两个eureka client 项目,client1,client2,模拟服务间通信
- 在client1中创建如下的controller
package cn.aaralyn.sellproduct.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @Auther: aaralyn * @Date: 2018/7/27 09:58 * @Description: */ @RestController public class ServiceController { @GetMapping("msg") public String msg(){ return "this is a message"; } }
接下来在client2中使用RestTemplate获取数据
-
在另一个client中创建如下controller,用于测试
package cn.aaralyn.sellorder.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; /** * @Auther: aaralyn * @Date: 2018/7/27 10:03 * @Description: */ @RestController public class ClientController { @GetMapping("getMsg") public String getMsg(){ return ""; } }
方式一
@GetMapping("getMsg")
public String getMsg(){
RestTemplate template = new RestTemplate();
return template.getForObject("http://localhost:8080/msg",String.class);
}
缺点:
- url硬编码,如果ip有变动,需要在代码中更改
- 如果lient2为集群,有多个url,该方法只能配一个url
方式二
注入LoadBalancerClient ,获得应用名称为PRODUCT的应用的其中一个实例,获得url,再使用RestTemplate获取数据,实现负载均衡
@RestController
public class ClientController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("getMsg")
public String getMsg() {
RestTemplate template = new RestTemplate();
ServiceInstance instance = loadBalancerClient.choose("PRODUCT");
String url = String.format("http://%s:%s", instance.getHost(), instance.getPort() + "/msg");
return template.getForObject(url, String.class);
}
}
方式三
RestTemplate通过配置注入Spring容器来使用
- 创建配置类,@LoadBalanced:实现负载均衡
package cn.aaralyn.sellorder.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * @Auther: aaralyn * @Date: 2018/7/27 10:43 * @Description: */ @Configuration public class RestTemplateConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
-
controller中注入restTemplate,直接调用getForObject方法,注意url中直接写应用名称,不要写ip:port
package cn.aaralyn.sellorder.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; /** * @Auther: aaralyn * @Date: 2018/7/27 10:03 * @Description: */ @RestController public class ClientController { @Autowired private RestTemplate restTemplate; @GetMapping("getMsg") public String getMsg() { return restTemplate.getForObject("http://PRODUCT/msg", String.class); } }
更多推荐
已为社区贡献1条内容
所有评论(0)