目標(biāo):
改進(jìn)上一章講的客戶端調(diào)用方式娄柳,集成feign襟士,簡(jiǎn)化客戶端調(diào)用
簡(jiǎn)介:
Fegin是一個(gè)聲明式的web服務(wù)客戶端温圆,它使得編寫web服務(wù)客戶端變得更加容易麻敌,其形態(tài)類似于mybatis對(duì)于dao層的封裝妇汗。
開工:
- 在commons創(chuàng)建返回vo模型帘不,以便多系統(tǒng)共用,具體業(yè)務(wù)意義不在這里討論
--------------------------------------請(qǐng)求vo----------------------------------
package open.template.work.commons.vo.udm.request;
import open.template.work.commons.vo.udm.BaseRequestVo;
public class TaskRequestVo extends BaseRequestVo {
/**
* 本服務(wù)應(yīng)用名
*/
private String appName;
/**
* 任務(wù)桶id
*/
private String bucketId;
。杨箭。寞焙。。
}
--------------------------------------返回vo----------------------------------
package open.template.work.commons.vo.udm.resposne;
import open.template.work.commons.vo.udm.BaseResponseVo;
/**
* 任務(wù)信息
*/
public class TaskReponseVo extends BaseResponseVo {
/**
* 任務(wù)桶id
*/
private String bucketId;
/**
* 任務(wù)id
*/
private String taskId;
/**
* 狀態(tài)
*/
private String status;
互婿。捣郊。。擒悬。模她。。
}
- 服務(wù)端添加新的restapi懂牧,先模擬返回此vo侈净,因?yàn)槿雲(yún)⑹菍?duì)象,所以需要添加@RequestBody 注解
@RestController
public class TaskInfoApi {
@PostMapping("/task/get")
public TaskReponseVo popTaskInfo(@RequestBody TaskRequestVo vo){
System.out.println("嘗試獲取桶"+vo.getBucketId()+"任務(wù)數(shù)據(jù)");
TaskReponseVo taskInfoDto = new TaskReponseVo();
taskInfoDto.setStatus("1");
taskInfoDto.setTaskId(UUID.randomUUID().toString());
return taskInfoDto;
}
}
- 客戶端添加feign配置僧凤,
首先添加feign依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
然后添加啟動(dòng)feign注解畜侦,并指定掃描的feign包
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "open.template.work.udm.client.feign")
public class UdmClientApplication {
public static void main(String[] args) {
SpringApplication.run(UdmClientApplication.class, args);
}
@Bean
public IRule ribbonRoundRobinRule() {
return new RandomRule();
}
}
添加feign聲明式接口
package open.template.work.udm.client.feign;
import open.template.work.commons.constants.CloudServerDirectory;
import open.template.work.commons.vo.udm.request.TaskRequestVo;
import open.template.work.commons.vo.udm.resposne.TaskReponseVo;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(name = CloudServerDirectory.UDM_SERVER)
public interface UdmServerTaskFegin {
@PostMapping("/task/get")
TaskReponseVo getTaskInfo(@RequestBody TaskRequestVo vo);
}
最后在service層和api層添加對(duì)應(yīng)調(diào)用測(cè)試邏輯,可以看到此時(shí)LoadBalancerClient方式和feign方式是共存的躯保,feign會(huì)自動(dòng)集成eureka和ribbon旋膳,所以此時(shí)的負(fù)載策略就是上章通過(guò)IRule和配置文件指定的負(fù)載規(guī)則,對(duì)于eureia我們通過(guò)@FeignClient(name = CloudServerDirectory.UDM_SERVER)注解在feign已指定途事,不需在拼接url验懊,完美集成擅羞。
package open.template.work.udm.client.service.impl;
import open.template.work.commons.constants.CloudServerDirectory;
import open.template.work.commons.http.RestTemplateFactory;
import open.template.work.commons.vo.udm.request.TaskRequestVo;
import open.template.work.commons.vo.udm.resposne.TaskReponseVo;
import open.template.work.udm.client.feign.UdmServerClient;
import open.template.work.udm.client.feign.UdmServerTaskFegin;
import open.template.work.udm.client.service.UdmServerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.stereotype.Service;
@Service
public class UdmServerServiceImpl implements UdmServerService {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private UdmServerClient udmServerClient;
@Autowired
private UdmServerTaskFegin udmServerTaskClient;
@Override
public String checkServerInfo() {
ServiceInstance instance = loadBalancerClient.choose(CloudServerDirectory.UDM_SERVER);
return RestTemplateFactory.getTemplate().getForObject(CloudServerDirectory.getServerUrl(instance.getHost(),instance.getPort())+"hello",String.class);
}
@Override
public String checkServer2(){
return udmServerClient.hello();
}
@Override
public TaskReponseVo getTaskInfo(String bucketId) {
TaskRequestVo vo=new TaskRequestVo();
vo.setBucketId(bucketId);
return udmServerTaskClient.getTaskInfo(vo);
}
}
- 都配了,啟動(dòng)服務(wù)測(cè)試一下
客戶端獲取到的數(shù)據(jù)
服務(wù)端日志:
服務(wù)端日志
完工义图!