• 简单的服务间通信


    简单的服务间通信

    一、RestTemplate

    使用步骤

    1、添加依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4

    2、向容器中注入一个restTemplate实例,使用@LoadBalanced开启负载均衡

    @SpringBootApplication
    @EnableEurekaClient
    @EnableDiscoveryClient
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run( ServiceRibbonApplication.class, args );
        }
    	//  使用注入到容器中
        @Bean
        @LoadBalanced
        RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3、在要使用的地方引入

    @Autowired
    private RestTemplate restTemplate;
    
    • 1
    • 2

    4、发送请求
    get请求:

    // 不带参数
    public String getDemo() {
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://demo-service/hello?name={name}", String.class);
        String body = responseEntity.getBody();
        System.out.println(body);
    }
    
    // 带参数
    public String getDemo() {
        Map<String, String> params = new HashMap<>(16);
        params.put("name", "Tony");
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://demo-service/hello?name={name}", String.class, params);
        String body = responseEntity.getBody();
        System.out.println(body);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    post请求

    // 带参数
    public String postDemo() {
        Map<String, String> params = new HashMap<>(16);
        params.put("name", "Tony");
        ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://demo-service/hello", params, String.class);
        String body = responseEntity.getBody();
        System.out.println(body);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    put请求

    public String putDemo() {
        restTemplate.put("http://demo-service/hello/{1}", "Tony");
    }
    
    • 1
    • 2
    • 3

    delete请求

    // 带参数
    public String deleteDemo() {
        restTemplate.delete("http://demo-service/hello/{1}", "Tony");
    }
    
    • 1
    • 2
    • 3
    • 4

    二、Feign

    使用步骤

    1、引入依赖

    <!--OpenFeign-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、启动类加上注解
    在这里插入图片描述

    3、构造接口
    注释:(name:唯一即可;url:可配置在配置文件中,增加系统灵活性)
    @FeignClient(name = “api/FileUpload”, url = “${fileUpload.path}”)

    /**
     * @author xusj
     * 
    CreateDate 2022/8/23 11:58 */
    @FeignClient(name = "api/FileUpload", url = "${fileUpload.path}") public interface FileUploadFeign { /*** *文件上传,默认请求头 * * @param file 文件 * @return {@link RespVO} * @author xusj *
    CreateDate 2022/8/23 12:47 */
    // 请求头需要注意,我这里是使用文件传输的请求头 @PostMapping(value = "/upload/uploadImg", headers = {"x-storesys-id=-3", "Content-Type=multipart/form-data"}) FileUploadVO uploadImg(@RequestPart("file") MultipartFile file); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    图解如下:
    在这里插入图片描述
    4、封装返回结果类:
    这里需要和调用接口后返回的值一致,不然会接收不到

    5、使用直接注入就行

    @Resource
     private FileUploadFeign fileUploadFeign;
    
    • 1
    • 2

    简单介绍一下也可以使用一下HuTool工具

    1、post请求

    // post请求 PayGameRequest.URL这是完整的请求地址
    HttpResponse response = HttpRequest.post(PayGameRequest.URL)
    							// 转换到body中
    							.form(BeanUtil.beanToMap(request))
    							.timeout(10000)
    							.execute();
            log.info("response {}", response.body());
            // 将返回结果,转回类
            PayResponse lfPayResponse = JSONUtil.toBean(response.body(),LFPayResponse.class);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2、get请求

    // 和上面是一样的,只是请求方式不一样,然后参数的位置不一样
    HttpResponse response = HttpRequest.get(PayMobileRequest.URL)
    							.form(BeanUtil.beanToMap(request))
    							.timeout(10000)
    							.execute();
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、这个只是简单的发送http请求

    有兴趣的可以看一下官方文档

    https://hutool.cn/

    三、总结

    1、两者的区别

    • restTemplate:使用起来较为麻烦,需要自己指定ribbon的负载均衡,但参数较灵活,请求的路径可以使用程序灵活控制。

    • feignClient:使用简单,默认集成了ribbon负载均衡,无需自己配置,但参数不灵活,适用于api固定的接口。

    2、原理后期补足,求大佬在评论区指导一下

    ==============》甲乙Rocket ;2022.08.28; 22年8月第四周

  • 相关阅读:
    原型链通俗解释
    gif表情制作一键轻松搞定,教你自制gif表情
    资源共享共赢系统应用
    将一个字符串str的内容颠倒(逆序)过来,并输出
    函数以及变量
    剑指Offer || 052.递增顺序搜索树
    DH 算法思想 SSH解决内容篡改问题
    数仓GreenPlum中数据实时同步的方式
    直播带货用什么成交话术可以提高销量
    【OAuth2】十六、Spring Authorization Server如何生成并发放token的
  • 原文地址:https://blog.csdn.net/weixin_46643875/article/details/126575806