三、Spring Cloud之软负载均衡 Ribbon (2)

在这里插入图片描述


重点看下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() 才行。

那如果多个参数的呢?
多个参数的常用的有两种方式,一个是和上面一样,直接在后面加参数就好了如下:

@RequestMapping("index3") public String getHello3(){ //多个参数拼接 String url = "http://"+ applicationName +"/hello3?name={1}&age={2}"; return restTemplate.getForObject(url,String.class,"quellanan","18"); }

还有一种方式就是将参数封装到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

@RequestMapping("index6") public String getHello6(){ //postForEntity 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.postForEntity(url,request,String.class).getBody(); }

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格式的参数。

@RequestMapping("/hello4") public String hello4(@RequestBody Map<String, Object> parms){ return "hello "+parms.get("name")+parms.get("age")+port; }

现在我们启动看下效果。

在这里插入图片描述


证明都是可以正常传递的。

Feign 简化微服务调用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfpsp.html