一、使用RestTemplate
1、在使用远程通信时,我们是通过RestTemplate来进行请求访问的,不过这个类是SpringWeb的,通这个类也可以达到一些携带参数请求的效果
使用:
依赖导入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
启动类注入
将这个类注入Spring,方便我们使用
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
使用
通过Spring自动装配
@Autowired
private RestTemplate template;
template.getForObject("http://provider/run", String.class);
第一个参数是请求路径,第二个参数是返回类型
二、使用Feign组件
1、依赖引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
这是SpringCloud第一代做远程通信的组件,Alibaba的叫Dubbo RPC
2、编写访问接口
这里专门为服务提供方写一个service
服务提供方controller
package com.csf.code.controller;
import com.csf.code.pojo.User;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.websocket.server.PathParam;
import java.util.Map;
@RestController
@RequestMapping("/user")
public class UserController {
//远程调用,路径传参 o
@RequestMapping("/{account}")
public Object get(@PathVariable String account){
return "admin="+account;
}
//远程调用,路径传参 o
@RequestMapping("/param")
public Object param(@PathVariable String account){
return "admin="+account;
}
@RequestMapping("/json")
public Object json(@RequestBody User user){
System.out.println(user);
return "yes";
}
@RequestMapping("/map")
public Object map(@RequestBody Map map){
System.out.println(map);
return "yes";
}
}
现在要做的,是由服务调用方,访问到这个提供方(消费者访问生产者)
1.为每一个请求地址写一个远程路径
2.在类上加上注解@FeignClient("provider") 后面的参数是在nacos上注册的服务地址
3.在启动类开启远程调用@EnableFeignClients
4.要与服务提供方的地址保持一致(地址由注解申明)
调用方service:
package com.csf.consumer.service;
import com.csf.consumer.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.websocket.server.PathParam;
import java.util.Map;
@FeignClient("provider")
public interface FeignUserService {
@RequestMapping("/user/{account}")
String get(@PathVariable(value="account") String account);
@RequestMapping("/user/param")
String param(@PathParam("account") String account);
@RequestMapping("/user/json")
String json(@RequestBody User user);
@RequestMapping("/user/map")
String map(@RequestBody Map<String,Object> map);
}
然后只要在controller中调用这个service的方法,就可以进行远程调用了
注:路径传参,需要在注解中写明参数
否则报错:
PathVariable annotation was empty on param 0.
注:在service中,接收只能使用String类型
否则会报错:
Could not extract response: no suitable HttpMessageConverter found for response type [class java.lang.Object] and content type [text/plain;charset=UTF-8]
远程通信效果达到了,使用RestTemplate和Feign组件都可以达到功能,不过对于后期使用而言,将远程路径封装在自己的接口之中会更方便一点。