本文主要是介绍SpringCloud(二):声明式RestClient—Feign,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
(编写不易,转载请注明:http://shihlei.iteye.com/blog/2399457)
一 概述
feign: 声明式rest 客户端,spring cloud 扩展了feign,提供了springmvc的标签支持,替代RestTemplate简化操作。
git:https://github.com/OpenFeign/feign
二 项目
服务提供者:《 SpringCloud(一): SpringBoot 创建简单的微服务》中的时间微服务——spring-cloud-microservice
服务消费者:《 SpringCloud(一): SpringBoot 创建简单的微服务》改进——spring-cloud-webfront 中 TimeService 实现
三 代码实现
(1)添加依赖
<!--rest client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId></dependency>
(2)资源文件添加时间微服务服务器配置:
server:port: 20001# 自定义配置 timeMisroService:server: http://localhost:10001
(3)定义feign接口
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)实现TimeService
package x.demo.springcloud.webfront.service;public interface TimeService {/*** 获取当前时间* @return 当前时间,格式: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 {@Resourceprivate TimeV1MicroServiceClient timeV1MicroServiceClient;/*** 获取当前时间** @return 当前时间,格式:yyyy-MM-dd HH:mm:ss*/@Overridepublic String now() {ProtocolResult<String> result = timeV1MicroServiceClient.now(null);return result.getBody();}
}
(5)controller 调用服务
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)开启FeignClient支持:主要是添加@EnableFeignClients,用于Spring Cloud 生成 实现
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)效果:同上篇
四 在普通的项目中使用 feign
区别:因为么有spring cloud 实例FeignClient,所以只能自己实例化FeignClient
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;@Beanpublic TimeV1MicroServiceClient timeV1MicroServiceClient() {return Feign.builder().encoder(new GsonEncoder()).decoder(new GsonDecoder()).contract(new SpringMvcContract()).options(new Request.Options(5000, 5000)).target(TimeV1MicroServiceClient.class, timeMisroServiceServer);}}
五 其他
(1)feign 目前不支持Mvc注解 @GetMapping @PostMapping 会报错
(2)提供json序列化支持
依赖:
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-gson</artifactId></dependency>
这篇关于SpringCloud(二):声明式RestClient—Feign的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!