温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》
  • 首页 > 
  • 教程 > 
  • 开发技术 > 
  • 分布式医疗挂号系统Nacos微服务Feign远程调用数据字典的方法

分布式医疗挂号系统Nacos微服务Feign远程调用数据字典的方法

发布时间:2022-04-25 11:56:09 来源:亿速云 阅读:346 作者:iii 栏目:开发技术

这篇文章主要介绍“分布式医疗挂号系统Nacos微服务Feign远程调用数据字典的方法”,在日常操作中,相信很多人在分布式医疗挂号系统Nacos微服务Feign远程调用数据字典的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分布式医疗挂号系统Nacos微服务Feign远程调用数据字典的方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    需求:制作一个医院列表的显示功能。列表中包含医院编号、医院等级、医院地址、状态等。
    分析:首先确定是典型的条件查询带分页。由于医院的等级需要查询数据字典部分,这个调用是在不同的微服务模块中,这就需要进行远程调用。

    步骤1:向Nacos服务中心注册微服务

    (1)引入Nacos依赖

      <!--服务注册-->
      <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。

    步骤2:使用Feign进行远程调用

    下面在service-hosp创建医院列表接口(条件查询带分页),在service-cmn中创建根据编号查询数据字典名称的医院等级接口。然后通过Feign完成远程调用。

    (1)service-hosp医院列表接口

    访问路径

    /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);
    }

    (2)service-cmn医院等级/地址接口

    由于医院等级、省市区地址都是取得数据字典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完成。

    (3)引入Feign依赖

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
                <scope>provided</scope>
            </dependency>

    单独创建service-cmn-clientMave工程进行远程调用。

    (4)调用端通过包扫描Feign

    在调用端的启动类上,添加 @EnableFeignClients(basePackages = "com.gql") 注解。

    (5)远程调用

    接口中的方法为要调用模块的方法签名,注意访问路径为完整路径,且形参中注解后要加上参数名称。

    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;
        }

    步骤3:使用swagger测试

    在swagger页面中添加请求参数后,点击执行按钮。

    分布式医疗挂号系统Nacos微服务Feign远程调用数据字典的方法

    成功通过远程调用获取到医院等级、地址:

    分布式医疗挂号系统Nacos微服务Feign远程调用数据字典的方法

    到此,关于“分布式医疗挂号系统Nacos微服务Feign远程调用数据字典的方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI