您好,登錄后才能下訂單哦!
這篇文章主要介紹“分布式醫療掛號系統Nacos微服務Feign遠程調用數據字典的方法”,在日常操作中,相信很多人在分布式醫療掛號系統Nacos微服務Feign遠程調用數據字典的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”分布式醫療掛號系統Nacos微服務Feign遠程調用數據字典的方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
需求:制作一個醫院列表的顯示功能。列表中包含醫院編號、醫院等級、醫院地址、狀態等。
分析:首先確定是典型的條件查詢帶分頁。由于醫院的等級需要查詢數據字典部分,這個調用是在不同的微服務模塊中,這就需要進行遠程調用。
<!--服務注冊--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
(2)配置微服務到Nacos 1.配置service-hosp
# 服務端口 server.port=8201 # 服務名 spring.application.name=service-hosp # Nacos服務地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
2.配置service-cmn
# 服務端口 server.port=8202 # 服務名 spring.application.name=service-cmn # Nacos服務地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3.將各微服務模塊添加到注冊中心
在各微服務模塊的啟動類添加@EnableDiscoveryClient
,表示將微服務注冊到Nacos。
下面在service-hosp創建醫院列表接口(條件查詢帶分頁),在service-cmn中創建根據編號查詢數據字典名稱的醫院等級接口。然后通過Feign完成遠程調用。
訪問路徑
/admin/hosp/hospital/list/{page}/{limit}
Controller:
@RestController @RequestMapping("/admin/hosp/hospital") @CrossOrigin public class HospitalController { @Autowired private HospitalService hospitalService; /** * 醫院列表(條件查詢帶分頁) * @param page * @param limit * @param hospitalQueryVo * @return */ @GetMapping("list/{page}/{limit}") public Result listHosp(@PathVariable Integer page, @PathVariable Integer limit, HospitalQueryVo hospitalQueryVo){ Page<Hospital> pageModel = hospitalService.selectHospPage(page,limit,hospitalQueryVo); return Result.ok(pageModel); } }
Service接口:
// 醫院列表(條件查詢帶分頁) Page<Hospital> selectHospPage(Integer page, Integer limit, HospitalQueryVo hospitalQueryVo);
Service實現類:
// 醫院列表(條件查詢帶分頁) @Override public Page<Hospital> selectHospPage(Integer page, Integer limit, HospitalQueryVo hospitalQueryVo) { // 1.創建pageable對象 Pageable pageable = PageRequest.of(page - 1, limit); // 2.創建條件匹配器 ExampleMatcher matcher = ExampleMatcher.matching() .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) .withIgnoreCase(true); // 3.hospitalQueryVo轉換為Hospital對象 Hospital hospital = new Hospital(); BeanUtils.copyProperties(hospitalQueryVo, hospital); // 4.創建對象 Example<Hospital> example = Example.of(hospital, matcher); // 5.調用方法實現查詢 Page<Hospital> pages = hospitalRepository.findAll(example, pageable); // 6.得到所有醫院信息的集合 pages.getContent().stream().forEach(item -> { // 此方法執行了遠程調用 this.setHospitalHosType(item); }); return pages; }
Repository:
@Repository public interface HospitalRepository extends MongoRepository<Hospital,String> { /** * 根據HosCode獲得記錄 * @param hoscode * @return */ Hospital getHospitalByHoscode(String hoscode); }
由于醫院等級、省市區地址都是取得數據字典value值,所以在列表顯示醫院等級、醫院地址時要根據數據字典value值獲取數據字典名稱。我們在這里需要寫兩個接口。
查詢醫院等級,訪問路徑為
/admin/cmn/dict/getName/{dictCode}/{value}
查詢醫院地址,訪問路徑為
/admin/cmn/dict/getName/{value}
Controller:
/** * 根據dictCode和value查詢 數據字典 * @param dictCode * @param value * @return */ @GetMapping("getName/{dictCode}/{value}") public String getName(@PathVariable String dictCode, @PathVariable String value) { String dictName = dictService.getDictName(dictCode, value); return dictName; } /** * 根據value查詢 數據字典 * @param value * @return */ @GetMapping("getName/{value}") public String getName(@PathVariable String value) { String dictName = dictService.getDictName("",value); return dictName; }
Service接口:
/** * 根據dictCode和value查詢 數據字典 * @param dictCode * @param value * @return */ String getDictName(String dictCode, String value);
Service實現類:
/** * 根據dictCode和value查詢 數據字典 * @param dictCode * @param value * @return */ @Override public String getDictName(String dictCode, String value) { // 如果dictCode為空,直接根據value查詢;否則根據dictCode和value查詢 if (StringUtils.isEmpty(dictCode)) { QueryWrapper<Dict> wrapper = new QueryWrapper<>(); wrapper.eq("value", value); Dict dict = baseMapper.selectOne(wrapper); return dict.getName(); } else { // 根據dictcode查詢dict對象,得到dict的id值 Dict codeDict = this.getDictByDictCode(dictCode); Long parent_id = codeDict.getId(); // 根據parent_id和value進行查詢 Dict finalDict = baseMapper.selectOne(new QueryWrapper<Dict>() .eq("parent_id", parent_id) .eq("value", value)); return finalDict.getName(); } }
數據訪問層由Mybatis-plus完成。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <scope>provided</scope> </dependency>
單獨創建service-cmn-client
Mave工程進行遠程調用。
在調用端的啟動類上,添加 @EnableFeignClients(basePackages = "com.gql") 注解。
接口中的方法為要調用模塊的方法簽名,注意訪問路徑為完整路徑,且形參中注解后要加上參數名稱。
1.遠程調用接口
// 要調用的微服務名稱 @FeignClient("service-cmn") @Repository public interface DictFeignClient { /** * 根據dictCode和value查詢 數據字典 * @param dictCode * @param value * @return */ @GetMapping("/admin/cmn/dict/getName/{dictCode}/{value}") public String getName(@PathVariable("dictCode") String dictCode, @PathVariable("value") String value); /** * 根據value查詢 數據字典 * @param value * @return */ @GetMapping("/admin/cmn/dict/getName/{value}") public String getName(@PathVariable("value") String value); }
2.執行遠程調用
@Autowired private DictFeignClient dictFeignClient; // 獲取查詢list集合,遍歷進行醫院等級封裝 private Hospital setHospitalHosType(Hospital hospital) { // 封裝醫院等級 String hostypeString = dictFeignClient.getName("Hostype", hospital.getHostype()); hospital.getParam().put("hostypeString", hostypeString); // 封裝醫院省市區 String provinceString = dictFeignClient.getName(hospital.getProvinceCode()); String cityString = dictFeignClient.getName(hospital.getCityCode()); String districtString = dictFeignClient.getName(hospital.getDistrictCode()); hospital.getParam().put("fullAddress", provinceString + cityString + districtString); return hospital; }
在swagger頁面中添加請求參數后,點擊執行按鈕。
成功通過遠程調用獲取到醫院等級、地址:
到此,關于“分布式醫療掛號系統Nacos微服務Feign遠程調用數據字典的方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。