(It is not easy to write, please indicate when reprinting: http://shihlei.iteye.com/blog/2399457 )
I. Overview
feign: A declarative rest client, spring cloud extends feign, provides springmvc tag support, and replaces RestTemplate to simplify operations.
git:https://github.com/OpenFeign/feign
Two items
Service Provider: Time Microservice in "SpringCloud (1): SpringBoot Creates Simple Microservices" - spring-cloud-microservice
Service consumer: "SpringCloud (1): SpringBoot creates a simple microservice" improvement - TimeService implementation in spring-cloud-webfront
Three code implementation
(1) Add dependencies
<!--rest client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>
(2) Resource file adding time microservice server configuration:
server: port: 20001 # custom configuration timeMisroService: server: http://localhost:10001
(3) Define the feign interface
package x.demo.springcloud.webfront.service.impl.feign; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import x.demo.springcloud.webfront.service.impl.ProtocolResult; @FeignClient(name = "microservice-time", url = "${timeMisroService.server}") public interface TimeV1MicroServiceClient { @RequestMapping(method = RequestMethod.GET, value = "/time/v1/now", consumes = MediaType.APPLICATION_JSON_VALUE) ProtocolResult<String> now(@RequestParam(name = "format", required = false) String format); }
(4) Implement TimeService
package x.demo.springcloud.webfront.service; public interface TimeService { /** * Get current time * @return current time, format: yyyy-MM-dd HH:mm:ss */ String now(); }
package x.demo.springcloud.webfront.service.impl; import javax.annotation.Resource; import org.springframework.stereotype.Service; import x.demo.springcloud.webfront.service.TimeService; import x.demo.springcloud.webfront.service.impl.feign.TimeV1MicroServiceClient; @Service("timeV1FeignImpl") public class TimeV1FeignImpl implements TimeService { @Resource private TimeV1MicroServiceClient timeV1MicroServiceClient; /** * Get current time * * @return current time, format: yyyy-MM-dd HH:mm:ss */ @Override public String now() { ProtocolResult<String> result = timeV1MicroServiceClient.now(null); return result.getBody(); } }
(5) The controller calls the service
package x.demo.springcloud.webfront.web; import javax.annotation.Resource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import x.demo.springcloud.webfront.service.TimeService; @RestController @RequestMapping("/time") public class TimeController { @Resource(name = "timeV1FeignImpl") private TimeService timeService; @GetMapping("/now") public String now() { return timeService.now(); } }
(6) Enable FeignClient support: mainly add @EnableFeignClients for Spring Cloud generation implementation
package x.demo.springcloud.webfront; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.feign.EnableFeignClients; @SpringBootApplication @EnableFeignClients public class SpringCloudWebfrontApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudWebfrontApplication.class, args); } }
(7) Effect: same as the previous article
4. Use feign in common projects
Difference: because there is no spring cloud instance FeignClient, you can only instantiate FeignClient yourself
package x.demo.springcloud.webfront.conf; import feign.Feign; import feign.Request; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.netflix.feign.support.SpringMvcContract; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; import x.demo.springcloud.webfront.service.impl.feign.TimeV1MicroServiceClient; @Configuration public class SpringConfiguration { @Value("${timeMisroService.server}") private String timeMisroServiceServer; @Bean public TimeV1MicroServiceClient timeV1MicroServiceClient() { return Feign.builder() .encoder(new GsonEncoder()) .decoder(new GsonDecoder()) .contract(new SpringMvcContract()) .options(new Request.Options(5000, 5000)) .target(TimeV1MicroServiceClient.class, timeMisroServiceServer); } }
Five other
(1) feign currently does not support Mvc annotation @GetMapping @PostMapping will report an error
(2) Provide json serialization support
rely:
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-gson</artifactId> </dependency>