微服务间的桥梁 Feign
生活随笔
收集整理的這篇文章主要介紹了
微服务间的桥梁 Feign
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一?搭建 service-client 父模塊
pom?文件如下
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>sdgt_parent</artifactId><groupId>com.baiyee</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>service_client</artifactId><groupId>com.baiyee</groupId><packaging>pom</packaging><modules><module>service_cmn_client</module></modules><dependencies><dependency><groupId>com.baiyee</groupId><artifactId>common_util</artifactId><version>0.0.1-SNAPSHOT</version><scope>provided</scope></dependency><dependency><groupId>com.baiyee</groupId><artifactId>model</artifactId><version>0.0.1-SNAPSHOT</version><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><scope>provided</scope></dependency><!-- 服務調用feign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><scope>provided</scope></dependency></dependencies> </project>二?搭建 service-cmn-client 模塊
1?pom?文件如下
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>service_client</artifactId><groupId>com.baiyee</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>service_cmn_client</artifactId><packaging>jar</packaging> </project>2?添加 Feign 接口類
@FeignClient(value = "service-cmn") @Repository public interface DictFeignClient {// 根據 dictcode 和 value 查詢@GetMapping("/admin/cmn/dict/getName/{dictCode}/{value}")String getName(@PathVariable("dictCode") String dictCode, @PathVariable("value") String value);// 根據 value 查詢@GetMapping("/admin/cmn/dict/getName/{value}")String getName(@PathVariable("value") String value);// 獲取 dictCode 對應的節點@GetMapping("/admin/cmn/dict/getByDictCode/{dictCode}")int getByDictCode(@PathVariable("dictCode") String dictCode); }三?遠程調用
1?在?service?模塊引入依賴
<!-- 服務調用feign --> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>2?在?service_obj?模塊添加依賴
<dependency><groupId>com.baiyee</groupId><artifactId>service_cmn_client</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope> </dependency>3?開啟服務調用
@SpringBootApplication @ComponentScan(basePackages = "com.baiyee") @EnableDiscoveryClient @EnableFeignClients(basePackages = "com.baiyee") public class ServiceApplication {public static void main(String[] args) {SpringApplication.run(ServiceApplication.class, args);} }4?遠程調用
package com.baiyee.sdgt.obj.service.impl;import com.baiyee.sdgt.cmn.client.DictFeignClient; import com.baiyee.sdgt.common.utils.ChineseCalendarUtils; import com.baiyee.sdgt.model.obj.*; import com.baiyee.sdgt.obj.mapper.CompanyVisitMapper; import com.baiyee.sdgt.obj.mapper.HospitalVisitMapper; import com.baiyee.sdgt.obj.mapper.PharmacyVisitMapper; import com.baiyee.sdgt.obj.mapper.TaskMapper; import com.baiyee.sdgt.obj.repository.VisitRepository; import com.baiyee.sdgt.obj.service.*; import com.baiyee.sdgt.vo.obj.TaskDistributionVo; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.util.*;/** * @className: TaskServiceImpl * @description: 任務實現類 * @date: 2021/10/4 * @author: cakin */ @Service public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService {@Autowiredprivate HospitalService hospitalService;@Autowiredprivate CompanyService companyService;@Autowiredprivate PharmacyService pharmacyService;@Autowiredprivate HospitalVisitService hospitalVisitService;@Autowiredprivate CompanyVisitService companyVisitService;@Autowiredprivate PharmacyVisitService pharmacyVisitService;@Autowiredprivate HospitalVisitMapper hospitalVisitMapper;@Autowiredprivate CompanyVisitMapper companyVisitMapper;@Autowiredprivate PharmacyVisitMapper pharmacyVisitMapper;@Autowiredprivate VisitRepository visitRepository;@Autowiredprivate DictFeignClient dictFeignClient;/*** @className: TaskService* @description: 任務分配* @date: 2021/10/17* @author: cakin*/@Overridepublic void distributeTask(TaskDistributionVo taskDistributionVo) {List<Task> taskList = new ArrayList<>();// 清空任務this.getBaseMapper().clearTask();hospitalVisitMapper.clear();companyVisitMapper.clear();pharmacyVisitMapper.clear();visitRepository.deleteAll();// 初始化任務initTask(taskDistributionVo, taskList);this.saveBatch(taskList);// 拜訪平均時間,默認為 30 分鐘int visitTime = dictFeignClient.getByDictCode("11");// 同區域移動平均時間,默認為 20 分鐘int shortMoveTime = dictFeignClient.getByDictCode("12");// 不同區域移動平均時間,默認為 45 分鐘int longMoveTime = dictFeignClient.getByDictCode("13");// 拜訪時間幅度,默認為 10 分鐘int visitTimeRange = dictFeignClient.getByDictCode("111");// 同區域移動時間幅度,默認為 5 分鐘int shortMoveTimeRange = dictFeignClient.getByDictCode("121");// 不同區域移動時間幅度,默認為 10 分鐘int longMoveTimeRange = dictFeignClient.getByDictCode("131");// 獲得年份String year = taskDistributionVo.getDate().substring(0, 4);// 獲得月份String month = taskDistributionVo.getDate().substring(5, 7);Calendar currentDate = Calendar.getInstance();// 設置開始掃描時間currentDate.set(Integer.parseInt(year), Integer.parseInt(month) - 1, 1);// 任務月份int taskMonth = currentDate.get(Calendar.MONTH);// 循環一天while (true) {// 日期字符串表示String calendar = currentDate.get(Calendar.YEAR) + "-" + (currentDate.get(Calendar.MONTH) + 1) + "-" + currentDate.get(Calendar.DATE);ChineseCalendarUtils cc = new ChineseCalendarUtils();// 如果是工作日,就可以安排任務if (cc.isWorkday(calendar)) {// 按照省、市、區排序QueryWrapper<Task> queryWrapper = new QueryWrapper<>();queryWrapper.orderByDesc("PROVINCE", "CITY", "DISTRICT", "COUNT");List<Task> tasks = this.getBaseMapper().selectList(queryWrapper);List<Segment> segments = new ArrayList<>();// 初始化分段initSegment(tasks, segments);// 依據 maxCount 對 segments 降序Collections.sort(segments);List<Task> taskAfterSortList = new ArrayList<>();// 對 tasks 進行重排,重排結果保存到 taskAfterSortListreSortTask(tasks, segments, taskAfterSortList);// 重排后// 記錄一次任務int i = 0;Calendar erreryDay = Calendar.getInstance();erreryDay.set(currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DATE), 8, 0, 0);while (true) {if (erreryDay.get(Calendar.HOUR_OF_DAY) > 18 || i >= taskAfterSortList.size()) {break;}Task task = taskAfterSortList.get(i);if (task.getCount() == 0) {i++;continue;}// 拜訪類型Integer type = task.getType();// 拜訪名稱String name = task.getName();// 記錄開始拜訪時間if (erreryDay.get(Calendar.HOUR_OF_DAY) >= 12 && erreryDay.get(Calendar.HOUR_OF_DAY) < 14) {erreryDay.set(Calendar.HOUR_OF_DAY, 14);}Date startDate = erreryDay.getTime();Random random = new Random();Date endDate;Visit visit = new Visit();// 醫院拜訪if (type == 1) {HospitalVisit hospitalVisit = new HospitalVisit();hospitalVisit.setName(name);visit.setName(name);hospitalVisit.setStartTime(startDate);visit.setStartTime(startDate);erreryDay.add(Calendar.MINUTE, visitTime + random.nextInt(2 * visitTimeRange + 1) - visitTimeRange);endDate = erreryDay.getTime();hospitalVisit.setEndTime(endDate);visit.setEndTime(endDate);if (erreryDay.get(Calendar.HOUR_OF_DAY) < 18) {hospitalVisitService.save(hospitalVisit);visitRepository.save(visit);task.setCount(task.getCount() - 1);System.out.println(hospitalVisit);} else {break;}} else if (type == 2) { // 公司拜訪CompanyVisit companyVisit = new CompanyVisit();companyVisit.setName(name);visit.setName(name);companyVisit.setStartTime(startDate);visit.setStartTime(startDate);erreryDay.add(Calendar.MINUTE, visitTime + random.nextInt(2 * visitTimeRange + 1) - visitTimeRange);endDate = erreryDay.getTime();companyVisit.setEndTime(endDate);visit.setEndTime(endDate);if (erreryDay.get(Calendar.HOUR_OF_DAY) < 18) {companyVisitService.save(companyVisit);visitRepository.save(visit);task.setCount(task.getCount() - 1);System.out.println(companyVisit);} else {break;}} else { // 藥房拜訪PharmacyVisit pharmacyVisit = new PharmacyVisit();pharmacyVisit.setName(name);visit.setName(name);pharmacyVisit.setStartTime(startDate);visit.setStartTime(startDate);erreryDay.add(Calendar.MINUTE, visitTime + random.nextInt(2 * visitTimeRange + 1) - visitTimeRange);endDate = erreryDay.getTime();pharmacyVisit.setEndTime(endDate);visit.setEndTime(endDate);if (erreryDay.get(Calendar.HOUR_OF_DAY) < 18) {pharmacyVisitService.save(pharmacyVisit);visitRepository.save(visit);System.out.println(pharmacyVisit);task.setCount(task.getCount() - 1);} else {break;}}this.saveOrUpdate(task);if (i + 1 >= task.getCount()) {continue;}if (taskAfterSortList.get(i + 1).getDistrict().equals(taskAfterSortList.get(i).getDistrict())) {erreryDay.add(Calendar.MINUTE, shortMoveTime + random.nextInt(2 * shortMoveTimeRange + 1) - shortMoveTimeRange);} else {erreryDay.add(Calendar.MINUTE, longMoveTime + random.nextInt(2 * longMoveTimeRange + 1) - longMoveTimeRange);}i++;}}// 日期加1天currentDate.add(Calendar.DATE, 1);// 跨月結束if (taskMonth != currentDate.get(Calendar.MONTH)) {break;}}}/*** 功能描述:對 tasks 進行重排** @param tasks 待排序任務* @return segments 排序分段* @author cakin* @date 2021/10/18*/private void reSortTask(List<Task> tasks, List<Segment> segments, List<Task> taskAfterSortList) {for (Segment segment : segments) {int from = segment.getFrom();int end = segment.getEnd();for (int i = from; i <= end; i++) {taskAfterSortList.add(tasks.get(i));}}}/*** 功能描述:初始化分段** @param tasks 待重排的任務* @param segments 排序分段* @author cakin* @date 2021/10/18*/private void initSegment(List<Task> tasks, List<Segment> segments) {for (int i = 0; i < tasks.size(); i++) {int headIndex = i;int tailIndex = i + 1;Task tasktHead = tasks.get(headIndex);if (tailIndex == tasks.size()) {Segment segment = new Segment();segment.setFrom(headIndex);segment.setEnd(headIndex);segment.setMaxCount(tasks.get(headIndex).getCount());segments.add(segment);break;}while (true) {Task taskTail;if (tailIndex != tasks.size()) {taskTail = tasks.get(tailIndex);if (!tasktHead.getDistrict().equals(taskTail.getDistrict())) {Segment segment = new Segment();segment.setFrom(headIndex);segment.setEnd(tailIndex - 1);segment.setMaxCount(tasks.get(headIndex).getCount());segments.add(segment);i = tailIndex - 1;break;}} else {Segment segment = new Segment();segment.setFrom(headIndex);segment.setEnd(tasks.size() - 1);segment.setMaxCount(tasks.get(headIndex).getCount());segments.add(segment);i = tasks.size() - 1;break;}tailIndex++;}}}/*** 功能描述:初始化任務列表** @param taskDistributionVo 前端傳過來的任務* @param taskList 分解后的任務* @author 貝醫* @date 2021/10/18*/private void initTask(TaskDistributionVo taskDistributionVo, List<Task> taskList) {// 醫院拜訪次數int count1 = taskDistributionVo.getCount1();List<Hospital> hospitalList = hospitalService.list();// 平均每一個醫院拜訪次數int avgHospitalCount = count1 / hospitalList.size();int plusHospitalCount = count1 % hospitalList.size();for (Hospital hospital : hospitalList) {Task task = new Task();task.setName(hospital.getName());task.setProvince(hospital.getProvince());task.setCity(hospital.getCity());task.setDistrict(hospital.getDistrict());task.setType(1);if (plusHospitalCount > 0) {task.setCount(avgHospitalCount + 1);plusHospitalCount--;} else {task.setCount(avgHospitalCount);}taskList.add(task);}// 公司拜訪次數int count2 = taskDistributionVo.getCount2();List<Company> companyList = companyService.list();// 平均每一個公司拜訪次數int avgCompanyCount = count2 / companyList.size();int plusCompanyCount = count2 % companyList.size();for (Company company : companyList) {Task task = new Task();task.setName(company.getName());task.setProvince(company.getProvince());task.setCity(company.getCity());task.setDistrict(company.getDistrict());task.setType(2);if (plusCompanyCount > 0) {task.setCount(avgCompanyCount + 1);plusCompanyCount--;} else {task.setCount(avgCompanyCount);}taskList.add(task);}// 藥房拜訪次數int count3 = taskDistributionVo.getCount3();List<Pharmacy> pharmacyList = pharmacyService.list();// 平均每一個藥房拜訪次數int avgPharmacyCount = count3 / pharmacyList.size();int plusPharmacyCount = count3 % pharmacyList.size();for (Pharmacy pharmacy : pharmacyList) {Task task = new Task();task.setName(pharmacy.getName());task.setProvince(pharmacy.getProvince());task.setCity(pharmacy.getCity());task.setDistrict(pharmacy.getDistrict());task.setType(3);if (plusPharmacyCount > 0) {task.setCount(avgPharmacyCount + 1);plusPharmacyCount--;} else {task.setCount(avgPharmacyCount);}taskList.add(task);}} }四?效果測試
1?任務分配
?2?拜訪列表
?
總結
以上是生活随笔為你收集整理的微服务间的桥梁 Feign的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dreamweaver制作php动态网页
- 下一篇: jd-gui的eclipse插件安装和使