1.现状
目前搭建feign服务的步骤如下:(单机,不涉及到集群)
先写feign api接口
@FeignClient(name = "demo", url = "${feign.demo.server}", configuration = FeignConfig.class)
public interface QueryCorpService {
/**
* 根据渠道code查询企业
*
* @param request
* @return
*/
@RequestMapping(value = "/feign/demo/queryCorp/byChannel", method = RequestMethod.POST)
FeignResult<QueryCorpResponse> queryCorpByChannel(@RequestBody CorpChannelRequest request);
}
application.yml配置:
feign:
salary:
demo: http://127.0.0.1:8080
appId: feign_demo
appSec: feign_secret
相关的核心类(部分):
@Configuration
public class FeignConfig {
private static String appId;
private static String appSec;
@Bean
public Contract feignContract() {
return new Contract.Default();
}
@Bean
public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
return new BasicAuthRequestInterceptor(appId, appSec);
}
public String getAppId() {
return appId;
}
@Value("${feign.demo.appId}")
public void setAppId(String appId) {
SalaryFeignConfig.appId = appId;
}
public String getAppSec() {
return appSec;
}
@Value("${feign.demo.appSec}")
public void setAppSec(String appSec) {
SalaryFeignConfig.appSec = appSec;
}
}
@Data
public class CorpChannelRequest {
private String channel;
private String channelCode;
private String startTime;
private String endTime;
private Integer pageSize;
private Integer page;
private Integer totalCount;
}
编写controller:
@Resource
private QueryCorpService queryCorpService;
@RequestMapping(value = "/feign/salary/queryCorp/byChannel", method = RequestMethod.POST)
FeignResult<QueryCorpResponse> queryCorpByChannel(@RequestBody CorpChannelRequest request){
return queryCorpService.queryCorpByChannel(request);
}
@Primary
@Service
public class QueryCorpServiceImpl implements QueryCorpService {
@Resource
private AthenaCorpClient athenaCorpClient;
@Resource
private SalaryConfigDAO salaryConfigDAO;
@Override
public FeignResult<QueryCorpResponse> queryCorpByChannel(@RequestBody CorpChannelRequest request) {
QueryCorpResponse response = new QueryCorpResponse();
if (request != null) {
CorpChannelQuery query = new CorpChannelQuery();
query.setChannel(request.getChannel());
query.setChannelCode(request.getChannelCode());
query.setPage(request.getPage());
query.setPageSize(request.getPageSize());
...
}
return FeignResult.getSuccessResult(response);
}
}
2.需要改进点
对于每个feign接口,都需要写相同的controller层接口,接口少还可以接受,但是遇到大量的接口,工作量较大,而且接口改动时还需要改controller层和seviceImpl实现层,影响后面的维护工作,引入代理工具类解决此问题
增加依赖:
<dependency>
<groupId>com.github.leecho</groupId>
<artifactId>spring-cloud-starter-feign-proxy</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
去掉代码
@Bean
public Contract feignContract() {
return new Contract.Default();
}
移除controller层代码即可,非常方便
网友评论