SpringCould远程调用参数传递

一、使用RestTemplate

1、在使用远程通信时,我们是通过RestTemplate来进行请求访问的,不过这个类是SpringWeb的,通这个类也可以达到一些携带参数请求的效果

使用:

依赖导入

        
            org.springframework.cloud
            spring-cloud-loadbalancer
        

启动类注入

将这个类注入Spring,方便我们使用

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

使用

通过Spring自动装配

    @Autowired
    private RestTemplate template;
    template.getForObject("http://provider/run", String.class);

第一个参数是请求路径,第二个参数是返回类型

二、使用Feign组件

1、依赖引入

        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        

这是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 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组件都可以达到功能,不过对于后期使用而言,将远程路径封装在自己的接口之中会更方便一点。

你可能感兴趣的:(springcloud,spring,cloud,Feign)