SpringCould远程调用参数传递

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无感_K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值