springboot2.1.*集成nacos和feign进行服务注册发现和调用
springboot2.1.*集成nacos和feign进行服务注册发现和调用,我要加入nacos的应用是一个单体多模块的springboot 2.1.8版本的Java应用。
1,引入和版本
版本这里springboot与springcloud的版本不对应会导致报错。nacos.version也可以用2.1.2.RELEASE
pom文件:
<nacos.version>2.1.1.RELEASE</nacos.version> <spring-cloud.version>Greenwich.SR4</spring-cloud.version>
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>${nacos.version}</version> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-okhttp</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
以及
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
2,@EnableFeignClients
可以启动类直接添加。
@SpringBootApplication @EnableFeignClients // add public class AppRun { public static void main(String[] args) { SpringApplication.run(AppRun.class, args); } }
3,配置
这里是一个基于本地的配置文件风格,如果不想改变风格,不使用nacos的配置功能,可以直接在对应配置文件中添加。
主配置:
spring.application.name=appname management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always spring.cloud.nacos.discovery.enabled=true spring.cloud.nacos.discovery.service=${spring.application.name} spring.cloud.nacos.discovery.group=yourgroupname
环境配置:
spring.cloud.nacos.discovery.namespace=dev spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
4,客户端编写
调用其他服务前,当然先看下别的服务的请求和返回,这里以一个全局唯一ID服务为例,入参一个业务类型,返回一个通用体包装下的long型id为例。
请求:
curl -X POST "http://192.168.168.85:8100/cbid/get/id/v1" -H "accept: */*" -H "Content-Type: application/json" -d "{ \"bizTag\": \"user_id\"}"
返回:
{ "body": { "id": 2015 }, "errorDesc": null, "retCode": "0000", "retMsg": null, "success": true }
基于这个接口,编写客户端:
@FeignClient(value = "id-genetator", path = "/id/get", contextId = "test") public interface IdGeneratorClient { @PostMapping(value = "/v1", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) @ResponseBody RemoteBaseRsp<IdGeneratorRsp> getId(@RequestBody IdGeneratorReq bizTag); }
public class RemoteBaseRsp<T> { private T body; private String errorDesc; private String retCode; private String retMsg; private Boolean success; }
IdGeneratorRsp和IdGeneratorReq就是两个对象。里面是具体的参数请求和返回。
5,调用测试
注入客户端,调用。
@Autowired private IdGeneratorClient idGeneratorClient; @Test public String get(){ RemoteBaseRsp<IdGeneratorRsp> test = idGeneratorClient.getId(IdGeneratorReq.builder().bizTag("test").build()); if(!test.getSuccess() || null == test.getBody()){ // 基础服务不可用,需要报系统异常 log.error("idGeneratorClient.getId 获取异常,请检查cbid"); // do error } // do sth. log.info("aa="+test); log.info("bb="+test.getBody().getId()); }