重点看下ribbon-provider 有两个端口,分别对应的我们的两个服务提供者。他们的appliaction.name是相同的。
再来调下面接口看看 :9003/index
可以看到每次调用访问了不同的服务提供者,两个服务端提供者是轮寻调用的。从而实现客户端的负载均衡 RestTemplate
上面说的负载均衡,其实还是RestTemplate 对象加上@LoadBalanced来实现的。并且前面只是简单的调用,没有涉及参数和请求方式,接下来我们看看常见的请求方式和有参数的调用。
Get 请求其实我们之前写的就是get 请求的方式,我们在来写一个有参数的请求
@RequestMapping("index2") public String getHello2(){ String url = "http://"+ applicationName +"/hello2?name={1}"; return restTemplate.getForObject(url,String.class,"quellanan"); }可以看到url 中请求的参数有占位符代替,getForObject或者getForEntity的第三个参数就是我们实际传的参数。这里说明一下getForObject 是直接获取返回的内容,而getForEntity返回的是一个http对象,包含相应状态码,想要回去内容需要getForEntity().getBody() 才行。
那如果多个参数的呢?
多个参数的常用的有两种方式,一个是和上面一样,直接在后面加参数就好了如下:
还有一种方式就是将参数封装到map 中,传过去。一样的也可以解析
@RequestMapping("index4") public String getHello4(){ //多参数组装 Map<String,String> parms=new HashMap<>(); parms.put("name","quellanan"); parms.put("age","18"); String url = "http://"+ applicationName +"/hello3?name={name}&age={age}"; return restTemplate.getForObject(url,String.class,parms); }我们在提供者中写两个方法便于测试
@RequestMapping("/hello2") public String hello2(@RequestParam("name") String name){ log.info(name); return "hello "+name+port; } @RequestMapping("/hello3") public String hello3(@RequestParam("name") String name,@RequestParam("age") String age){ log.info(name+age); return "hello "+name+age+port; }我们启动来看下结果
可以看到参数是传递成功的啦。 Post 请求
post 请求和get 请求差不多,我这里就将参数封装到map中了
postForEntity
postForObject
@RequestMapping("index7") public String getHello7(){ //postForObject JSONObject params=new JSONObject(); params.put("name","quellanan"); params.put("age","18"); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity request = new HttpEntity(params.toJSONString(), headers); String url = "http://"+ applicationName +"/hello4"; return restTemplate.postForObject(url,params,String.class); }主要是先将参数封装在JSONObject 中,然后设置HttpHeaders 和HttpEntity ,然后请求。
我们采用的application/json 的格式,我们在服务提供者中加一个方法。用来接收json格式的参数。
现在我们启动看下效果。
证明都是可以正常传递的。 Feign 简化微服务调用