07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心

1.Nacos作为注册中心

Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理 平台。他是使用 java 编写。需要依赖 java 环境

官方文档

1.启动nacos-server

下载安装 nacos-server: https://github.com/alibaba/nacos/releases

打开安装目录
07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第1张图片

  • cmd中输入命令startup.cmd -m standalone, 以单机模式启动(开发测试阶段用这个, 所以现在用这个)

    或者修改startup.cmd文件中的set MODE=“standalone”, 然后就可以双击这文件启动nacos了
    07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第2张图片

    另外cmd中输入命令startup.cmd -m cluster是以集群模式启动,这个模式需要创建数据库, 详情网上找教程

  • 访问 http://localhost:8848/nacos/

  • 使用默认的账号密码都是nacos

07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第3张图片

07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第4张图片

2.将微服务注册到 nacos 中

1.在gulimall-common模块导入依赖

        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>

记得加一个版本管理

 <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>2.1.0.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>Greenwich.SR5version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

每次更新gulimall-common记得clean和install一下

2.在微服务模块加入依赖(如果该模块不需要调用别的模块的服务,则不需要使用openfeign, 也就不需要导入该依赖)

        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-openfeignartifactId>
        dependency>

避免报错

No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?

这是版本的问题, 我们把spring-cloud的版本降低一下

    <properties>
        <java.version>1.8java.version>
        <spring-cloud.version>Greenwich.SR3spring-cloud.version>
    properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

在application.properties添加配置

#你的服务模块的名字
spring.application.name=gulimall-member
#nacos的ip
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

启动类上加入开启服务注册发现注解

@EnableDiscoveryClient

3.编写服务

这里我们简单编写一个服务来测试一下, 就是gulimall-member模块调用gulimall-product模块的服务

1.gulimall-product

package com.atguigu.gulimall.product.controller;

import com.atguigu.common.utils.R;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("product/test")
public class TestController {

    @RequestMapping("/list")
    public R list(){
        String[] list =  {"苹果", "香蕉", "桃子"};
        return R.ok().put("list",list);
    }
}

2.gulimall-member
07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第5张图片
启动类GulimallMemberApplication

package com.atguigu.gulimall.member;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;


@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
public class GulimallMemberApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallMemberApplication.class, args);
    }

}

ProductFeignService

package com.atguigu.gulimall.member.feign;


import com.atguigu.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient("gulimall-product")  //使用商品服务
public interface ProductFeignService {

    @GetMapping("/product/test/list")
    R getProductList();
}

ProductController

package com.atguigu.gulimall.member.controller;


import com.atguigu.common.utils.R;
import com.atguigu.gulimall.member.feign.ProductFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProductController {

    @Autowired
    private ProductFeignService productFeignService;

    @GetMapping("/test")
    public R list(){
        return productFeignService.getProductList();
    }
}

4.运行测试

把这两个服务运行启动

07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第6张图片

07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第7张图片

2.Nacos作为配置中心

1.相关概念

  • 命名空间namespace:
    用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的 配置。Namespace的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生 产环境的资源(如配置、服务)隔离等。

    spring.cloud.nacos.config.namespace=xxxx
    
  • 配置分组group:
    Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade)对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。

    spring.cloud.nacos.config.group=xxx
    

    每个微服务创建自己的 namespace 进行隔离,group 来区分 dev,beta,prod 等环境

    spring.cloud.nacos.config.namespace=member
    spring.cloud.nacos.config.group=dev
    
  • 配置集: 一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。

  • 配置集 ID: Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有 意义的名称标识。Data ID 通常采用类 Java包(如com.taobao.tc.refund.log.level)的命名 规则保证全局唯一性。此命名规则非强制。

    #配置文件可以拆分为多个子文件
    #第1个子文件,配置数据源
    spring.cloud.nacos.config.ext-config[0].group=dev
    spring.cloud.nacos.config.ext-config[0].data-id=member-datasource.yml
    spring.cloud.nacos.config.ext-config[0].refresh=true
            
    #第2个子文件,配置mybatis
    spring.cloud.nacos.config.ext-config[1].group=dev
    spring.cloud.nacos.config.ext-config[1].data-id=member-mybatis.yml
    spring.cloud.nacos.config.ext-config[1].refresh=true
    

2.原理

  • 自动注入: NacosConfigStarter 实现了org.springframework.cloud.bootstrap.config.PropertySourceLocator接口,并将优先级设置成了最高。 在 Spring Cloud 应用启动阶段,会主动从 Nacos Server端获取对应的数据,并将获取到的 数据转换成 PropertySource 且注入到 Environment 的PropertySources 属性中,所以使用 @Value 注解也能直接获取 Nacos Server 端配置的内容。

  • 动态刷新: Nacos Config Starter 默认为所有获取数据成功的 Nacos 的配置项添加了监听功能,在监听到服务端配置发生变化时会实时触发org.springframework.cloud.context.refresh.ContextRefresher 的 refresh方法 。 如果需要对 Bean 进行动态刷新,请参照 Spring 和 Spring Cloud 规范。推荐给类添加@RefreshScope 或 @ConfigurationProperties 注解

3.编写测试

1.登录nacos管理界面, 为gulimall-member的配置文件创建命名空间
07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第8张图片

2.在nacos管理界面, 为gulimall-member的配置文件创建配置文件

在 nacos 中创建一个 " 应用名.properties "的配置文件并编写配置 , 项目使用的时候可以通过 dataId 和 group 来唯一确定该条配置,不用data id。

gulimall-member.properties
07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第9张图片

新建一个配置子文件,项目使用的时候需要用data id来确定它

gulimall-member-datasource.properties
07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第10张图片

07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第11张图片

3.编写gulimall-member模块的代码,进行测试

application.properties

server.port=9010

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.56.103/gulimall_ums?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root

spring.application.name=gulimall-member
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

member.name=lisi
member.age=15

在resources目录下创建bootstrap.properties, 注册中心的配置优先级高于本地的配置

spring.application.name=gulimall-member
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=e1c3d8b5-1ba4-4720-a9ad-e0b7abb8e2e5
spring.cloud.nacos.config.group=dev

#配置文件可以拆分为多个子文件
#第1个子文件,配置数据源
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].data-id=gulimall-member-datasource.properties
spring.cloud.nacos.config.ext-config[0].refresh=true

测试类

package com.atguigu.gulimall.member.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
@RefreshScope  //动态刷新
public class TestController {

    @Value("${member.name}")
    private String name;

    @Value("${member.age}")
    private Integer age;

    @GetMapping("/show")
    public Map<String, Object> test(){
        Map map = new HashMap<String, Object>();
        map.put("name", name);
        map.put("age", age);
        return map;
    }
}

4.运行

1.初始时
访问http://localhost:9010/show

07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第12张图片

2.修改配置中心的配置文件
07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第13张图片
可以看到数据动态刷新了

07-GuliMall SpringCloud Alibaba-Nacos作为注册中心、配置中心_第14张图片

你可能感兴趣的:(谷粒商城学习笔记,spring,cloud,微服务,java)