微服务间的桥梁 Feign
生活随笔
收集整理的這篇文章主要介紹了
微服务间的桥梁 Feign
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一?搭建 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><!-- 服務(wù)調(diào)用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 接口類(lèi)
@FeignClient(value = "service-cmn") @Repository public interface DictFeignClient {// 根據(jù) dictcode 和 value 查詢(xún)@GetMapping("/admin/cmn/dict/getName/{dictCode}/{value}")String getName(@PathVariable("dictCode") String dictCode, @PathVariable("value") String value);// 根據(jù) value 查詢(xún)@GetMapping("/admin/cmn/dict/getName/{value}")String getName(@PathVariable("value") String value);// 獲取 dictCode 對(duì)應(yīng)的節(jié)點(diǎn)@GetMapping("/admin/cmn/dict/getByDictCode/{dictCode}")int getByDictCode(@PathVariable("dictCode") String dictCode); }三?遠(yuǎn)程調(diào)用
1?在?service?模塊引入依賴(lài)
<!-- 服務(wù)調(diào)用feign --> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>2?在?service_obj?模塊添加依賴(lài)
<dependency><groupId>com.baiyee</groupId><artifactId>service_cmn_client</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope> </dependency>3?開(kāi)啟服務(wù)調(diào)用
@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?遠(yuǎn)程調(diào)用
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: 任務(wù)實(shí)現(xiàn)類(lèi) * @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: 任務(wù)分配* @date: 2021/10/17* @author: cakin*/@Overridepublic void distributeTask(TaskDistributionVo taskDistributionVo) {List<Task> taskList = new ArrayList<>();// 清空任務(wù)this.getBaseMapper().clearTask();hospitalVisitMapper.clear();companyVisitMapper.clear();pharmacyVisitMapper.clear();visitRepository.deleteAll();// 初始化任務(wù)initTask(taskDistributionVo, taskList);this.saveBatch(taskList);// 拜訪平均時(shí)間,默認(rèn)為 30 分鐘int visitTime = dictFeignClient.getByDictCode("11");// 同區(qū)域移動(dòng)平均時(shí)間,默認(rèn)為 20 分鐘int shortMoveTime = dictFeignClient.getByDictCode("12");// 不同區(qū)域移動(dòng)平均時(shí)間,默認(rèn)為 45 分鐘int longMoveTime = dictFeignClient.getByDictCode("13");// 拜訪時(shí)間幅度,默認(rèn)為 10 分鐘int visitTimeRange = dictFeignClient.getByDictCode("111");// 同區(qū)域移動(dòng)時(shí)間幅度,默認(rèn)為 5 分鐘int shortMoveTimeRange = dictFeignClient.getByDictCode("121");// 不同區(qū)域移動(dòng)時(shí)間幅度,默認(rèn)為 10 分鐘int longMoveTimeRange = dictFeignClient.getByDictCode("131");// 獲得年份String year = taskDistributionVo.getDate().substring(0, 4);// 獲得月份String month = taskDistributionVo.getDate().substring(5, 7);Calendar currentDate = Calendar.getInstance();// 設(shè)置開(kāi)始掃描時(shí)間currentDate.set(Integer.parseInt(year), Integer.parseInt(month) - 1, 1);// 任務(wù)月份int taskMonth = currentDate.get(Calendar.MONTH);// 循環(huán)一天while (true) {// 日期字符串表示String calendar = currentDate.get(Calendar.YEAR) + "-" + (currentDate.get(Calendar.MONTH) + 1) + "-" + currentDate.get(Calendar.DATE);ChineseCalendarUtils cc = new ChineseCalendarUtils();// 如果是工作日,就可以安排任務(wù)if (cc.isWorkday(calendar)) {// 按照省、市、區(qū)排序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);// 依據(jù) maxCount 對(duì) segments 降序Collections.sort(segments);List<Task> taskAfterSortList = new ArrayList<>();// 對(duì) tasks 進(jìn)行重排,重排結(jié)果保存到 taskAfterSortListreSortTask(tasks, segments, taskAfterSortList);// 重排后// 記錄一次任務(wù)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;}// 拜訪類(lèi)型Integer type = task.getType();// 拜訪名稱(chēng)String name = task.getName();// 記錄開(kāi)始拜訪時(shí)間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();// 醫(yī)院拜訪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);// 跨月結(jié)束if (taskMonth != currentDate.get(Calendar.MONTH)) {break;}}}/*** 功能描述:對(duì) tasks 進(jìn)行重排** @param tasks 待排序任務(wù)* @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 待重排的任務(wù)* @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++;}}}/*** 功能描述:初始化任務(wù)列表** @param taskDistributionVo 前端傳過(guò)來(lái)的任務(wù)* @param taskList 分解后的任務(wù)* @author 貝醫(yī)* @date 2021/10/18*/private void initTask(TaskDistributionVo taskDistributionVo, List<Task> taskList) {// 醫(yī)院拜訪次數(shù)int count1 = taskDistributionVo.getCount1();List<Hospital> hospitalList = hospitalService.list();// 平均每一個(gè)醫(yī)院拜訪次數(shù)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);}// 公司拜訪次數(shù)int count2 = taskDistributionVo.getCount2();List<Company> companyList = companyService.list();// 平均每一個(gè)公司拜訪次數(shù)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);}// 藥房拜訪次數(shù)int count3 = taskDistributionVo.getCount3();List<Pharmacy> pharmacyList = pharmacyService.list();// 平均每一個(gè)藥房拜訪次數(shù)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);}} }四?效果測(cè)試
1?任務(wù)分配
?2?拜訪列表
?
總結(jié)
以上是生活随笔為你收集整理的微服务间的桥梁 Feign的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: dreamweaver制作php动态网页
- 下一篇: jd-gui的eclipse插件安装和使