Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理 平台。他是使用 java 编写。需要依赖 java 环境
官方文档
下载安装 nacos-server: https://github.com/alibaba/nacos/releases
cmd中输入命令startup.cmd -m standalone, 以单机模式启动(开发测试阶段用这个, 所以现在用这个)
或者修改startup.cmd文件中的set MODE=“standalone”, 然后就可以双击这文件启动nacos了
另外cmd中输入命令startup.cmd -m cluster是以集群模式启动,这个模式需要创建数据库, 详情网上找教程
访问 http://localhost:8848/nacos/
使用默认的账号密码都是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
这里我们简单编写一个服务来测试一下, 就是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
启动类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();
}
}
把这两个服务运行启动
命名空间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
自动注入: 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 注解
1.登录nacos管理界面, 为gulimall-member的配置文件创建命名空间
2.在nacos管理界面, 为gulimall-member的配置文件创建配置文件
在 nacos 中创建一个 " 应用名.properties "的配置文件并编写配置 , 项目使用的时候可以通过 dataId 和 group 来唯一确定该条配置,不用data id。
新建一个配置子文件,项目使用的时候需要用data id来确定它
gulimall-member-datasource.properties
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;
}
}
1.初始时
访问http://localhost:9010/show