微服务远程调用简单总结

2022-11-22 20:25:13 浏览数 (2)

需求:项目调用公共服务区提供的接口

方法一:FeignClient

适用于都注册在远程服务托管中心的服务之间的调用,如Eurake,Nacos之类

导入依赖:

代码语言:javascript复制
 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

yml配置

代码语言:javascript复制
spring:
  application:
    name: qdchess-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848    
#适用于运行于同一个服务器之间的参数
#不在同一个服务器的话就填对应地址

FeignClient接口编写:

代码语言:javascript复制
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

/**
 * @Author Diuut
 * @Date 2020/10/13  9:55
 */
@FeignClient(name = "qdchess-cmd")
public interface CmdFeignClient {
    //接收方直接接收String格式,拿到的就是一串String
    //如需要json格式的话就带@requestBody注解
    @RequestMapping(value = "/wxpay",consumes = "text/plain",headers = "")
    public String wxpay(@RequestParam String request);
    @RequestMapping(value = "wxpay/verify")
    public String wxcallback(@RequestBody String request);
    @RequestMapping(value = "/alipay",method = RequestMethod.POST)
    public String alipay(@RequestBody String request);
    @RequestMapping(value = "alipay/verify")
    public String alicallback(@RequestBody String request);
}
//根据调用接口不同,收发参数接收发送方式也不同

剩下的就只需要注入,然后就像调用一个方法一样直接调用接口即可,如果遇到延迟较大超时等问题,就需要在yml自己配置超时时间。

方法二:RestTemplate

添加Config类

代码语言:javascript复制
@Configuration
public class RestTemplateConfig{
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        List<HttpMessageConverter<?>> list = restTemplate.getMessageConverters();
        for (HttpMessageConverter<?> httpMessageConverter : list) {
            if(httpMessageConverter instanceof StringHttpMessageConverter) {
                ((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.forName("utf8"));
                break;
            }
        }
        return restTemplate;
    }
}

为方便使用的话也编写一个类用于调用,也可以直接在其他方法里调用

代码语言:javascript复制
/**
 * @Author Diuut
 * @Date 2020/10/15  10:03
 */
@Component
@Slf4j
public class RestTemplateClient {
    @Autowired
    private RestTemplate restTemplate;

    public String wxpay(String str){
        return restTemplate.postForObject("http://qdchess-cmd/wxpay",str, String.class);
    }
    public String wxcallback(String str){
        return restTemplate.postForObject("http://qdchess-cmd/wxpay/verify",str, String.class );
    }
    public String alipay(String str){
        return restTemplate.postForObject("http://qdchess-cmd/alipay",str, String.class );
    }
    public String alicallback(String str){
        return restTemplate.postForObject("http://qdchess-cmd/alipay/verify",str, String.class );
    }
    public String applecallback(String str){
        return restTemplate.postForObject("http://qdchess-cmd/alipay/verify",str, String.class );
    }
}
//也可以设定不同的传参方式

方法三:WebClient

第三个方式更多的针对于webFlux中的写法,如果与普通的阻塞写法混用的话,因为异步的原因,无法获取调用接口响应的数据,因此不太方便,不建议优先使用,这里便省略。

Post Views: 156

0 人点赞