Spring Cloud【二】—— 微服务调用之FeignClient
一、应用说明
1、项目开发过程中,出于项目分离考虑、项目访问安全及项目集中化管理考虑,有时候需要建立接口层统一对接底层微服务,向外部暴露接口层访问信息,外部仅能访问接口层,接口获取相关信息拼接后再请求微服务请求,访问时携带bean封装的多对象参数,返回结果为JSON参数,封装成bean对象,本章主要介绍FeignClient请求方式访问方式。
2、本项目中,接口层项目与底层子项目均部署在consul上。
3、FeignClient也支持公网IP地址访问,即支持调用外部http网络通信。
二、consul
1、consul说明
consul是一个服务网格解决方案,可以实现微服务之间相互的调用,consul简化了分布式环境下服务的注册和发现流程,
2、使用流程:
1)consul下载安装
下载地址:https://www.consul.io/downloads.html
2)启动项目前需要先启动consul服务。
服务启用命令:cmd->consul agent -dev
3)在项目中加入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
- 配置文件application.yml
###服务端口号 server: port: 8406 spring: ####consul注册中心地址 cloud: consul: host: localhost port: 8500 discovery: hostname: localhost
运行项目,在浏览器输入:http://localhost:8500,可以看到已经注册的项目
3、子项目可发现
被调用的子项目需在启动类application上添加项目可被发现的标志——@EnableDiscoveryClient,将微服务注册到服务发现组件上,让注册中心扫描到该服务
@EnableDiscoveryClient @SpringBootApplication public class ChatbotSearchServiceApplication { public static void main(String[] args) { SpringApplication.run(ChatbotSearchServiceApplication.class, args); } }
三、FeignClient
1、使用说明
feign是Springboot cloud体系下的一个重要组件,用于微服务间的调用,底层为httpClient。
feign 暂时不支持GET方式传递bean类封装的多参数对象,feign调用用GET请求传递复杂参数时,底层的urlhttpclient会自动把get方法转为post方法,因此需要针对bean类进行转换,主要有三种方式:
1)将 bean封装的多参数对象拆散成一个一个单独的属性放在方法参数里。(不适用于参数多的案例)
2)使用 GET 传递 @Requestbody(慎用),此方式违反 RESTFul 规范,要求被请求项目参数支持Requestbody,且需要将FeignClient的访问方式替换为apache下的httpclient访问方式。
3)把方法参数变成 Map 传递。
本项目通过第三种方法把方法参数变成 Map 传递实现。
2、pom.xml添加依赖
<!-- feign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
3、application.yml配置超时
feign: client: default: #设置5S超时 connectTimeout: 5000
四、项目实现
1、项目包含主要类说明
1)启动类application
2)访问携带的参数对象bean类RequestVo;
3)返回json结果封装的bean类ResponseVo;
4)controller类
5)接口类、接口实现类;
2、启动类application
需要在主函数上添加注解@EnableFeignClients,使用注解@EnableFeignClients启用feign客户端。
package com.cmic.official; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; /** * @author LittlePrince * @create 2020/7/8 9:36 * @description */ @EnableDiscoveryClient @SpringBootApplication @EnableFeignClients public class OfficialApplication { public static void main(String[] args) { SpringApplication.run(OfficialApplication.class, args); } }
3、访问携带的参数对象bean类RequestVo;
package com.cmcc.offical.vo.search; import lombok.Data; import org.springframework.cglib.beans.BeanMap; import javax.validation.constraints.*; import java.util.HashMap; import java.util.Map; /** * @author LittlePrince * @create 2020/7/9 11:04 * @description */ @Data public class RequestVo { /** * 关键字(一个或多个) */ private String q; /** * 返回的结果个数,取值范围是[1, 100]。 * 当前默认值是10。 */ @Max(value = 100) @Min(value = 1) private int num = 10;
4、返回json结果封装的bean类ResponseVo;
package com.cmcc.offical.vo.search; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; /** * @author LittlePrince * @create 2020/7/9 14:04 * @description */ @Data @JsonInclude(JsonInclude.Include.NON_NULL) public class ResponseVo { //标识 private String id; //名称 private String name; //图标 private String icon; //描述信息 private String description; }
5、controller类
package com.cmic.official.controller; import com.cmic.official.service.IService; import com.cmic.official.vo.search.RequestVo; import com.cmic.official.vo.search.ResponseVo; import org.apache.http.util.TextUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; /** * @author LittlePrince * @create 2020/7/8 9:36 * @description */ @RestController public class OfficialController { private static final Logger LOG = LoggerFactory.getLogger(OfficialController.class); @Autowired private IService service; @RequestMapping(value = "/official/search", method = RequestMethod.GET, produces = "application/json") public @ResponseBody ResponseVo search(@Valid RequestVo requestVo) throws Exception { LOG.info("request=" + requestVo); ResponseVo responseVo = service.search(new org.apache.commons.beanutils.BeanMap(requestVo)); LOG.info("response=" + responseVo); return responseVo; }
- 接口类和接口类的实现
此处接口类方法search必须与被调用子项目的方法保持一致。
使用注解@FeignClient 定义feign客户端 ,将远程服务映射为一个本地Java方法调用。
package com.cmic.official.service; import com.cmic.official.vo.search.ResponseVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import java.util.Map; /** * 搜索服务的接口 * * @author LittlePrince * @create 2020/7/8 9:12 * @description */ @FeignClient("search") public interface IService { /** * 根据请求参数实现Chatbot搜索 * @param RequestVo * @return */ @RequestMapping(value = "/botlist", method = RequestMethod.GET, produces = "application/json") ResponseVo search(@RequestParam Map requestVo); }
五、项目结果
用户携带参数访问接口地址,接口层内部跳转访问子项目,获取相应的返回结果呈现出来
- Spring cloud踩坑记录之使用feignclient远程调用服务404的方法
- 使用Spring cloud Feign在后台服务之间调用传递Multipart无法传递的问题
- spring cloud feign 调用微服务转发不了request请求头和参数问题解决方案
- springcloud 服务feign调用问题
- Spring Cloud Feign 声明式服务调用
- SpringCloud 查找调用REST服务使用RestTemplate(ribbon负载)或feign模式 教程源码 火推
- Spring Cloud(十一)声名式服务调用:Feign的使用 (上)
- Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n
- SpringCloud 第二节 两种服务调用方式(ribbon和feign)
- Spring Cloud(三)服务间调用Feign
- 【图文经典版】声明式调用服务SpringCloud之Feign实例讲解
- springcloud服务与服务之间的调用(Feign)
- SpringCloud系列——Feign 服务调用
- 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务
- SpringCloud使用Feign进行服务调用
- Spring Cloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务
- SpringCloud Feign 服务调用的实现
- SpringCloud之服务提供与调用(Ribbon,Feign)
- 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务
- spring cloud feign 调用服务注意问题