之前在项目里面都是指定一个interface做FeignClient,带上FeignClient的注解,这样子每一个微服务都需要有个interface。在做中台项目的时候需要通过配置化来创建FeignClient,就想到怎么手动去创建FeignClient。一番操作猛如虎后,写个memo以防自己以后忘记了。
在 https://start.spring.io/ 中勾选Eureka Server,下载下来后:
代码:Application类上加注解 @EnableEurekaServer
配置文件:
server.port=8761 spring.application.name=eureka-server eureka.instance.hostname=localhost eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
启动即可,访问 http://localhost:8761 可以看到eureka的页面
在 https://start.spring.io/ 中勾选Eureka Discovery Client,下载下来后:
代码:Application类上加注解:
@EnableDiscoveryClient //启用服务发现客户端 @SpringBootApplication @EnableFeignClients //启用feignClient
pom.xml文件如果没有以下两项的话需要加上:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
自己写个Controller:
@RestController @RequestMapping("/test") public class TestController { @PostMapping("/test") public boolean test(@RequestBody Test test) { return true; } }
配置文件:
spring.application.name=feign-server server.port=8001 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
启动后查看 eureka,看到feign-server被注册上了。
在 https://start.spring.io/ 中勾选Eureka Discovery Client,下载下来后:
pom.xml文件如果没有以下两项的话需要加上:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
创建一个feignClient但是不用注解FeignClient:
public interface PersonFeignClient { @RequestMapping(value = "/test/test", method = RequestMethod.POST) boolean personTest(@RequestBody Test test); }
动态创建FeignClient的类:
@Component @Import(FeignClientsConfiguration.class) public class PersonTest { //自定义的FeignClient PersonFeignClient personFeignClient; //Feign 原生构造器 Feign.Builder builder; //创建构造器 public PersonTest(Decoder decoder, Encoder encoder, Client client, Contract contract) { this.builder = Feign.builder() .client(client) .encoder(encoder) .decoder(decoder) .contract(contract); } public void test() { String serviceId="feign-server"; Test test = new Test(); test.setTest(false); //注意 构建的url 必须添加 http:// this.personFeignClient = this.builder.target(PersonFeignClient.class, "http://" + serviceId); //使用FeignClient请求服务 boolean result = this.personFeignClient.personTest(test); System.out.println(result); } }
使用的地方:
@RestController @RequestMapping("/test") public class TestController { @Autowired PersonTest personTest; ... @GetMapping("/test3") public boolean test3() { personTest.test(); return true; } }
配置文件:
spring.application.name=feign-client server.port=8002 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
启动后,请求http://localhost:8001/test/test3 即可访问。
参考: https://www.cnblogs.com/yunxi520/articles/12037168.html
http://blog.didispace.com/spring-cloud-starter-dalston-2-3/
https://cloud.tencent.com/developer/article/1483067