Spring下使用RestTemplate实现单点远程调用
使用的原理是httpclient
官网地址:
http://hc.apache.org/httpclient-3.x/
但是已经停止服务了。。。
Spring下使用参考文档:
链接:https://pan.baidu.com/s/1xZU5EhZg6OecKX7KbI8xnA
提取码:ewcc
调用方法说明:
1.案例基础
基于实现的项目代码:
SpringBoot下使用Swagger2开发API文档
因此实现的基础是上面这个项目已经运行
具体实现的结果是远程调用该项目的controller的getById方法,并将结果返回到前端页面
2.开发远程调用
2.1 pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2.2 application.properties配置
配置端口,防止端口冲突
#端口指定
server.port=9999
2.3 DemoApplication
因为使用RestTemplate,而默认容器中没有,需要向容器中先注入一个
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
//向容器中注入一个RestTemplate
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2.4 两个项目共同返回前端数据封装类R
//用于返回数据的封装
@Data
public class R {
private Integer code;
private Boolean status;
private Map<String,Object> data =new HashMap<>();
private String message;
//私有构造方法
private R(){}
//链式编程
public static R ok(){
R r = new R();
r.setStatus(true);
r.setCode(200);
return r;
}
public static R error(String message,Integer code){
R r =new R();
r.setStatus(false);
r.setCode(code);
r.setMessage(message);
return r;
}
//数据封装
public R put(String key,Object value){
this.data.put(key,value);
return this;
}
}
2.5 controller开发
@RestController
public class DemoController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/demo1")
public String demo1(){
R r = restTemplate.getForObject("http://localhost:8089/stu/student/4", R.class);
return String.valueOf(r.getData().get("data"));
}
}
或者用返回的ResponseEntity(包含了数据返回页面的响应头响应体等信息)
@RestController
public class DemoController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/demo1")
public String demo1(){
// R r = restTemplate.getForObject("http://localhost:8089/stu/student/4", R.class);
ResponseEntity<R> forEntity = restTemplate.getForEntity("http://localhost:8089/stu/student/4", R.class);
return String.valueOf(forEntity.getBody().getData().get("data"));
}
}
2.6 返回结果
3. 缺点
只能点对点的调用,当使用分布式微服务时不能很好适用
4.解决方案
使用注册中心