Java请求网络资源的类。
private static final CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet(url);
CloseableHttpResponse response = httpclient.execute(httpget);
String result = null;
HttpEntity entity = response.getEntity();
if (entity != null) {
result = EntityUtils.toString(entity);
}
System.out.println(result);
Spring封装了库,提供更为简洁的资源请求方式RestTemplate。
RestTemplate是Spring提供的用于访问Rest服务的客户端,提供了多种便捷访问远程Http服务的方法。
restTemplate使用simpleClientHttpRequestFactory工厂,
默认以HttpURLConnection方式发起请求。
RestTemplate restTemplate=new RestTemplate();
String result = restTemplate.getForObject(url, String.class);
System.out.println(result);
其中get代表get请求,Object代表结果封装类型。restTemplate会自动发起请求,接收响应并帮我们对响应结果进行反序列化。
exchange方法提供统一的方法模板进行四种请求:POST,PUT,DELETE,GET
String reqJsonStr = "{\"code\":\"testCode\", \"group\":\"testGroup\",\"content\":\"testContent\", \"order\":1}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(reqJsonStr,headers);
ResponseEntity<Map> resp = restTemplate.exchange(DIC_DATA_URL, HttpMethod.POST, entity, Map.class);
ResponseEntity<Map> resp = restTemplate.exchange(DIC_DATA_URL, HttpMethod.PUT, entity, Map.class);
Response`Entity<Map> resp = restTemplate.exchange(DIC_DATA_URL + "?id={id}", HttpMethod.DELETE, null, Ma`p.class, 227);
ResponseEntity<String> results = restTemplate.exchange(url,HttpMethod.GET, null, String.class, params);
restTemplate大多是基于Http的方法。
getForObject: 发送get请求,结果封装为指定对象。 提供class指定
getForEntity: 发送get请求,结果为Entity类型。
postForObject: 发送post请求,结果封装为指定对象
put:
delete:
exchange:通用执行方法
RPC即remote procedure call,远程程序调用。你像调本地接口一样调用远程接口的方式,就是RPC。
SpringCloud开发的多个微服务之间是相对独立的,但有时候也是需要相互访问的。这就是微服务之间的RPC。
一般使用RestTemplate与Feign两种方式实现。
RestTemplate是Spring提供的用于访问Rest服务的客户端。
注册RestTemplate
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
服务提供方,服务名称:service1,端口:8082;
@RestController
@RequestMapping("/service1")
public class TestController {
@RequestMapping(value = "test", method = {RequestMethod.POST,RequestMethod.GET})
public String test(@RequestParam(value = "testParam") String testParam) {
System.println.out(testParam);
return "success";
}
}
消费方根据URL调用
@RestController
@RequestMapping("/serviceFront")
public class ServiceFrontController {
private final static String SERVICE1_URL = "http://SERVICE1:8082";
private final static String SERVICE1 = "SERVICE1";
@Autowired
LoadBalancerClient loadBalancerClient;
@Autowired
RestTemplate restTemplate;
@RequestMapping(value = "testFront", method = RequestMethod.POST)
public HashMap<String,Object> testFront(@RequestParam String testParam) {
this.loadBalancerClient.choose(SERVICE1);// 随机访问策略
String result = restTemplate.getForObject(SERVICE1_URL + "/service1/test?testParam={1}", String.class, testParam);
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("result", "测试结果!"+result);
return map;
}
}
Feign是一种声明式的伪Http客户端。
用来优雅地调用Http API。
Feign封装了Ribbon和Hystrix也就是客户端负载均衡以及服务容错保护。
Ribbon里面有个啥?RestTemplate
RestTemplate是个啥?封装了Http请求,实现了客户端负载均衡。
咋实现的负载均衡,在注册RestTemplate的时候添加l@LoadBalanced注解
最后Feign做了啥?简化了我们自行封装RestTemplate服务调用客户端的开发量
消费方创建一个接口继承服务提供方的接口,使用注解的方式配置该接口,这样就完成了对服务提供方的接口绑定。
@RestController
@RequestMapping("/service2")
public class TestController2 {
@RequestMapping(value = "test2", method = {RequestMethod.POST,RequestMethod.GET})
public String test2(@RequestParam(value = "testParam2") String testParam2) {
System.println.out(testParam2);
return "success";
}
}
/**
* 封装调用服务接口
*/
@FeignClient(name = "SERVICE2")
public interface TestFeignClient {
//@RequestLine("GET /service2/test2")
@RequestMapping(value="/service2/test2",method = RequestMethod.GET)
public String test2(@RequestParam("testParam2") String testParam2);
}
@RestController
@RefreshScope
@RequestMapping("/serviceFront2")
public class TestFeignController {
@Autowired
private TestFeignClient testFeignClient;
@RequestMapping(value = "test2", method = { RequestMethod.POST })
public HashMap<String,Object> test2(@RequestParam String testParam2) {
String result = testFeignClient.test2(testParam2);
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("result", "测试结果!"+result);
return map;
}
}