从零开始创建微服务-nacos-day4

6 Nacos启动

6.0 Nacos简单介绍

不同模块调用不同模块之间的数据,我们的架构是基于微服务的,此时就需要用到注册中心与服务调用,把我们的微服务各模块注册到注册中心。注册中心选用Nacos。Nacos详细介绍移步https://www.cnblogs.com/crazymakercircle/p/14231815.html(醍醐灌顶)。

为什么选用Nacos作为注册中心呢?先看看cap模型

6.0.1 cap模型

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

  • 一致性(Consistency):同一时间看到的数据是一致的
  • 可用性(Availability) :所有的请求都会得到响应

Eureka,Nacos都支持AP,都有控制台管理;Nacos还支持CP。Nacos的CP模式切换

curl -X PUT `$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

什么意思?虽然CAP不可三者兼得,但是我可以切换模式,就是玩儿

一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring Cloud 和 Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。

如果需要在服务级别编辑或者存储配置信息,那么CP是必须的,K8S服务和DNS服务则适用于CP模式。CP模式下支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

6.0.2 注册中心性能对比

NacosEurekaConsulCoreDNSZookeeper
一致性协议CP+APAPCP-------CP
健康检查TCP/HTTP/MYSQL/Client BeatClient BeatTCP/HTTP/gRPC/Cmd-------Keep Alive
负载均衡策略权重/metadata/SelectorRibbonFabioRoundRobin-------
雪崩保护
自动注销实例支持支持不支持不支持支持
访问协议HTTP/DNSHTTPHTTP/DNSDNSTCP
监听支持支持支持支持不支持支持
多数据中心支持支持支持不支持不支持
跨注册中心同步支持不支持支持不支持不支持
SpringCloud集成支持支持支持不支持支持
Dubbo集成支持不支持不支持不支持支持
K8S集成支持不支持支持支持不支持

6.1 Nacos安装与启动

以windows版本为例,下载压缩包解压到指定文件夹,在bin目录下双击startup.cmd,启动nacos

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DbSyAvQ2-1640156286458)(C:\Users\1234\AppData\Roaming\Typora\typora-user-images\image-20211221161856602.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lE5m18ra-1640156286459)(C:\Users\1234\AppData\Roaming\Typora\typora-user-images\image-20211221162434374.png)]

6.2 模块向Nacos注册

1 添加依赖

在service模块pom中添加nacos的依赖,各子模块便可以复用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C7DKosTZ-1640156286460)(C:\Users\1234\AppData\Roaming\Typora\typora-user-images\image-20211221164139875.png)]

<!-- 服务注册 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2 配置application.properties

在这里插入图片描述

# nacos\u670D\u52A1\u5730\u5740
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

3 在启动类上添加@EnableDiscoveryClient

在各模块的启动类上添加@EnableDiscoveryClient,项目启动的时候这个服务就会自动向Nacos注册,在http://127.0.0.1:8848/nacos中可以查看注册情况(用户名和密码都是nacos,端口号和地址和自己的对应上就行)。

@SpringBootApplication
@ComponentScan(basePackages = "com.tjj")
@EnableDiscoveryClient
public class ServiceCmnApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceCmnApplication.class, args);
    }
}
@SpringBootApplication
@ComponentScan(basePackages = "com.tjj")
@EnableDiscoveryClient
public class ServiceHospApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceHospApplication.class, args);
    }
}

6.3 声明式调用Feign

已经有注册中心了,那怎么调用呢?

预备:与service同级目录下创建service-client模块,删掉src文件夹,在service-client模块下,创建与service模块下子模块的client

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vD53DaE6-1640156286461)(C:\Users\1234\AppData\Roaming\Typora\typora-user-images\image-20211222103528478.png)]

6.3.1 使用Feign远程调度其他服务

模块1向模块2调用得到一些信息,需要用到spring-cloud的feign组件,有关于Feign的介绍,移步https://www.cnblogs.com/crazymakercircle/p/11965726.html

  1. 添加相关依赖

service模块添加Feign的依赖与其他的需要的依赖

  <!-- 服务调用feign -->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>
 <dependency>
      <groupId>com.tjj</groupId>
      <artifactId>common-util</artifactId>
      <version>1.0</version>
 </dependency>

 <dependency>
      <groupId>com.tjj</groupId>
      <artifactId>model</artifactId>
      <version>1.0</version>
      <scope>provided</scope>
 </dependency>

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <scope>provided</scope>
 </dependency>
  1. 在配置文件application.properties中做相关配置

  2. 在模块中添加接口,并加上@FeignClient注解,注解括号里为需要调用的服务名称(service模块的application.properties里面配置的服务名称,并不是服务模块的包名,只是为了规范一点,包名和服务名称取的名字一致)

@FeignClient("service-cmn")
@Repository
public interface DictFeignClient {

    
}

然后在接口里面真正定义调用接口的名称、路径、相关参数,其实就是对应service模块controller里面需要调用的方法一模一样,只是没有方法体(路径要补充完整,需要补充参数名称)

@FeignClient("service-cmn")
@Repository
public interface DictFeignClient {

    /**
     * 获取数据字典名称
     * @param parentDictCode
     * @param value
     * @return
     */
    @GetMapping(value = "/admin/cmn/dict/getName/{parentDictCode}/{value}")
    String getName(@PathVariable("parentDictCode") String parentDictCode, @PathVariable("value") String value);

    /**
     * 获取数据字典名称
     * @param value
     * @return
     */
    @GetMapping(value = "/admin/cmn/dict/getName/{value}")
    String getName(@PathVariable("value") String value);
}
  1. 在调用模块引入service-client里面的模块,pom加入client依赖(模块2调用模块1,模块2就是调用模块)

service-hosp模块调用service-cmn字典模块

 <dependency>
      <groupId>com.tjj</groupId>
      <artifactId>service-cmn-client</artifactId>
      <version>1.0</version>
 </dependency>
  1. 在需要调用的service层里面注入,然后就能不同的服务之间就能远程调用了
package com.tjj.hosp.service.impl;
@Service
public class HospitalServiceImpl implements HospitalService {
    @Autowired
    private HospitalRepository hospitalRepository;

    //注入client里面的接口到service
    @Autowired
    private DictFeignClient dictFeignClient;
    
    //省略...
    //封装数据,遍历进行医院等级封装
    private Hospital packHospital(Hospital hospital) {
        String hostypeString = dictFeignClient.getName("Hostype",hospital.getHostype());
        String provinceString = dictFeignClient.getName(hospital.getProvinceCode());
        String cityString = dictFeignClient.getName(hospital.getCityCode());
        String districtString = dictFeignClient.getName(hospital.getDistrictCode());

        hospital.getParam().put("hostypeString", hostypeString);
        hospital.getParam().put("fullAddress", provinceString + cityString + districtString + hospital.getAddress());
        return hospital;
    }

  1. 在调用模块的启动类上添加@EnableFeignClients开启Feign Client功能,(basePackages = “com.tjj”)指定扫描的模块路径
@SpringBootApplication
@ComponentScan(basePackages = "com.tjj")
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.tjj")
public class ServiceHospApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceHospApplication.class, args);
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xxl-job-nacos 是一个基于微服务的调度系统。它的设计理念是通过将大型应用拆分成多个微服务,每个微服务都有一个独立的调度器,用于管理该微服务的任务调度和执行。xxl-job-nacos 使用 Nacos 作为注册中心,通过 Nacos 实现微服务的注册和发现。 通过将任务调度设置为微服务的一部分,xxl-job-nacos 可以实现任务的集中管理和分布式部署。它提供了一套友好的调度管理界面,用于配置和监控任务的运行情况。用户可以通过该界面添加、编辑和删除任务,指定任务的执行时间和频率。同时,xxl-job-nacos 支持任务的动态调度,可以实时修改任务的执行策略和参数,以适应不同的业务需求。 通过使用 Nacos 作为注册中心,xxl-job-nacos 实现了任务的注册和发现。当一个新任务被添加到调度系统中时,它会通过 Nacos 将任务的信息注册到注册中心,并通知相应的微服务微服务通过订阅注册中心的信息,获知新任务的相关信息,并根据任务的调度策略和配置进行任务的执行。当任务执行完成后,微服务会将执行结果反馈给 xxl-job-nacos,并更新任务状态和日志。 总的来说,xxl-job-nacos 是一个基于微服务的调度系统,它通过将任务调度设置为微服务的一部分,实现了任务的集中管理和分布式部署。同时,xxl-job-nacos 使用 Nacos 作为注册中心,实现了任务的注册和发现,以实时更新任务的信息和执行结果。通过这样的设计,xxl-job-nacos 可以提供强大的任务调度能力,适用于大型应用的任务调度和分布式执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值