SpringCloud系列+Alibaba Nacos,使用Nacos替代Eureka与Spring Cloud Config

      开年公司架构调整,准备走微服务架构,大佬们讨论后大概就是springcloud系列了,之前也有过springcloud核心组件的学习,不过现在得集成Nacos来替代官方推荐的eureka与config作为注册中心和分布式配置中心。

    1.下面弄来一张对比图,看一下:

对比:

1.性能也不差,对于服务数量小于上千台来说,性能没有问题
2.eureka: 可以做注册中心,完全AP,支持注册中心之间的节点复制,同时支持服务端同时注册多个注册中心节点, 所以不存节点信息不一致的情况
3.config: 单独服务,是从git仓库拉取配置信息,然后服务端从config服务里面拉取配置信息缓存到本地仓库, 这里配置的变更比较麻烦,他需要结合bus组件,同时约束了只能用rabbitmq和kafka来进行通知服务端进行配置变更。
  但是保证了数据的一致性,因为他的配置信息在git仓库上,git仓库只有一个,就会数据一致 

下面就直接来看speingcloud集成nacos步骤,先测试服务注册与发现,再测试分布式配置中心:

1.启动Nacos服务并配置

nacos下载地址:nacos下载

2.启动

  1. Linux/Unix/Mac 操作系统,执行命令 sh startup.sh -m standalone
  2. Windows 操作系统,执行命令 cmd startup.cmd
  3. 默认账户密码:nacos

3.进入nacos页面:http://localhost:8848/nacos/index.html

4.在某个微服务(生产者)的pom中导入jar包

<!-- 注册中心所需依赖  用于服务注册与发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>

        <!-- 配置中心所需依赖  用于分布式配置-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>

5.新建bootstrap.yml配置文件,内容如下

# Spring
spring:
  application:
    name: springcloud-provider-jobinfo
  profiles:
    # 环境配置
    active: dev
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        # 配置文件格式
        file-extension: yml
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
        # 配置组,需要与nacos上一致,否则找不到
        group: nacos-test
        #命名空间默认是public,无需填。在nacos新建命名空间时,需要填写命名空间id
        namespace: 

6.启动类上加注解@EnableDiscoveryClient //服务发现~,启动服务发现与注册功能。

7.生产者写api,供消费服务调用:

@RestController
public class QcpageProviderController {
    @Autowired
    QcpageService qcpageService;

    @Autowired
    DiscoveryClient client;


    @GetMapping("/qcpage/getAll")
    public List<Qcpage> getAll(){
        List<Qcpage> list= qcpageService.list();
        return list;
    }

    @GetMapping("/qcpage/getById/{id}")
    public Qcpage getById(@PathVariable("id")Integer id){
        Qcpage qcpage=qcpageService.getById(id);
        return qcpage;
    }

    @DeleteMapping("/qcpage/deleteById/{id}")
    public boolean deleteById(@PathVariable("id")Integer id){
        boolean flag=qcpageService.removeById(id);
        return flag;
    }

    //获取注册进来的微服务,可以获得一些微服务信息,服务发现
    @GetMapping("/qcpage/getservice")
    public Object getService(){
        List<String> service=client.getServices();
        System.out.println("service:"+service);
        List<ServiceInstance> instances=client.getInstances("springcloud-provider-jobinfo");
        for (ServiceInstance instance : instances) {
            System.out.println("serviceId:"+instance.getServiceId());
            System.out.println("InstanceId:"+instance.getInstanceId());
            System.out.println("host:"+instance.getHost());
            System.out.println("port:"+instance.getPort());
        }
        return this.client;
    }
}

7.启动该服务,进入nacos页面,点击服务管理-服务列表,可以看到服务已经注册到nacos:

8.再创建一个微服务(消费者)用于服务调用,同样先导入上述两个jar包,新建bootstrap.yml配置文件,在启动类上加注解@EnableDiscoveryClient。由于消费者无需多余的配置,无任何业务,所以不用再添加nacos的config配置,直接忽略,bootstrap.yml内容如下:

server:
  port: 10010

# Spring
spring:
  application:
    # 应用名称
    name: springcloud-nacos
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848

9.添加ConfigBean配置类如下:

@Configuration
public class ConfigBean {
    @Bean
    @LoadBalanced //此注解开启请求时使用ribbon负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

10.添加controller用于调用生产者服务api:

@RestController
public class TestController {

    @Autowired
    private RestTemplate restTemplate;

    //开启负载均衡后,主机名与端口号使用服务名代替
    private static final String PRIFIX="http://springcloud-provider-jobinfo";

    @RequestMapping("/consumer/jobinfo/getConfig")
    public String getConfig(){
        return restTemplate.getForObject(PRIFIX+"/qcpage/getConfig",String.class);
    }

    @RequestMapping("/consumer/jobinfo/getById/{id}")
    public Qcpage getById(@PathVariable("id")Integer id){
        return restTemplate.getForObject(PRIFIX+"/qcpage/getById/"+id,Qcpage.class);
    }

    @RequestMapping("/consumer/jobinfo/getAll")
    public List<Qcpage> getAll(){
        return restTemplate.getForObject(PRIFIX+"/qcpage/getAll",List.class);
    }

    @RequestMapping("/consumer/jobinfo/deleteById/{id}")
    public void deleteById(@PathVariable("id")Integer id){
        restTemplate.delete(PRIFIX+"/qcpage/deleteById/{id}",id);
    }
}

11.启动消费者服务,并进入nacos页面,服务管理-服务列表,两个微服务都已注册进来:

12.现在使用消费服务调用生产服务,我的消费端接口为http://localhost:10010/consumer/jobinfo/getById/{id},调用一下试试,会通过RestTemplate远程调用生产服务的接口

服务注册与发现就完了,接下来进行分布式配置中心的使用步骤:

1.先在nacos添加服务所需的配置:

新建配置:

  1. 理论: Nacos中的datatid的组成格式及与SpringBoot配置文件中的匹配规则
    在Nacos Spring Cloud中,dataId的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
  • prefix默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。
  • spring.profile.active即为当前环境对应的profile。注意:当spring.profile.active为空时,对应的连接符-也将不存在,dataId的拼接格式变成${prefix}.${file-extension}
  • file-extension为配置内容的数据格式,可以通过配置项为spring.cloud.nacos.config.file-extension来配置。目前只支持propertiesyaml类型。

下面是我的配置,我将生产服务的配置内容copy到了这里,加下来以生产服务为例:

2.bootstrap.yml配置如下:

# Spring
spring:
  application:
    name: springcloud-provider-jobinfo
  profiles:
    # 环境配置
    active: dev
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        # 配置文件格式
        file-extension: yml
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
        # 配置组,需要与nacos上一致,否则找不到
        group: nacos-test
        #命名空间默认是public,无需填。在nacos新建命名空间时,需要填写命名空间id
        namespace: 

3.将原有配置注释,并提供接口用于获取远程的配置属性:

@RestController
@RefreshScope
public class QcpageProviderController {

    @Value(value = "${info.company.name}")
    private String companyName;

    @Value(value = "${info.author.name}")
    private String authorName;

    @GetMapping("/qcpage/getConfig")
    public String getInfo(){
        return authorName+companyName;
    }
}

4.调用接口,看是否能从nacos上拉取配置:

5.在不重启项目的前提下,修改nacos上的配置,然后再次调用看结果:

这样就可一方便集中管理各项目的配置文件,并在修改配置时,无需重启项目,对于线上环境以及开发时节省了很多时间。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值