简单的服务间通信

导读:本篇文章讲解 简单的服务间通信,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

简单的服务间通信

一、RestTemplate

使用步骤

1、添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

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();
    }
}

3、在要使用的地方引入

@Autowired
private RestTemplate restTemplate;

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);
}

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);
}

put请求

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

delete请求

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

二、Feign

使用步骤

1、引入依赖

<!--OpenFeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

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

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

/**
 * @author xusj
 * <br>CreateDate 2022/8/23 11:58
 */
@FeignClient(name = "api/FileUpload", url = "${fileUpload.path}")
public interface FileUploadFeign {
    /***
     *文件上传,默认请求头
     *
     * @param file 文件
     * @return {@link RespVO<String>}
     * @author xusj
     * <br>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);
}

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

5、使用直接注入就行

@Resource
 private FileUploadFeign fileUploadFeign;

简单介绍一下也可以使用一下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);

2、get请求

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

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

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

https://hutool.cn/

三、总结

1、两者的区别

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96195.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!