nacos是阿里的一个开源产品,是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。(用来实现配置中心和服务注册中心)
服务发现和服务健康监测(使服务更容易注册,并通过DNS或HTTP接口发现其他服务,还提供服务的实时健康检查,以防 止向不健康的主机或服务实例发送请求。 )
动态配置服务
动态 DNS 服务
服务及其元数据管理
从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据
Nacos引用命名空间、分组、dataId来管理配置和注册的服务, Namespace + Group + DataId 三者关系 类似 Java 里面的 package 包名和类名
命名空间,即 Namespace,用于进行粗粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
Nacos 中存在一个默认的命名空间 public,所有配置以及服务注册,在没有指定命名空间时都会默认从 public 这个命名空间拉取配置以及注册到该命名空间下的注册表中。
我这里新建一个nacosStudy命名空间,当然一般情况下是建dev、test和pro这种。
Group
是对配置进行分组,在nacosStudy空间下,新建了一个producter-discovery.properties,group是producter的配置文件
创建一个父工程,其pom配置为
<properties>
<java.version>1.8java.version>
<spring.boot-version>2.3.2.RELEASEspring.boot-version>
<spring.cloud-version>Hoxton.SR9spring.cloud-version>
<spring.alibaba.cloud-version>2.2.6.RELEASEspring.alibaba.cloud-version>
<druid.version>1.2.5druid.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${spring.boot-version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring.cloud-version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring.alibaba.cloud-version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>${druid.version}version>
dependency>
dependencies>
dependencyManagement>
创建子工程nacos-discovery引用父工程,其pom配置为
<parent>
<artifactId>nacosStudyartifactId>
<groupId>com.lijiegroupId>
<version>0.0.1-SNAPSHOTversion>
<relativePath/>
parent>
<artifactId>nacos-discoveryartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>nacos-discoveryname>
<description>Demo project for Spring Bootdescription>
<packaging>jarpackaging>
<properties>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-contextartifactId>
dependency>
dependencies>
nacos-discovery工程新建一个bootstrap.properties配置文件,内容为
#项目名称
spring.application.name=producter-discovery
#nacos服务发现地址
spring.cloud.nacos.discovery.server-addr=192.168.40.59:8848
#nacos服务发现命名空间
spring.cloud.nacos.discovery.namespace=f0fe0beb-7c1f-4808-aa21-5f27509e4af7
#启用nacos配置中心的配置
spring.cloud.nacos.config.enabled=true
#取nacos配置文件名称
#spring.cloud.nacos.config.prefix=${spring.application.name}
#指定nacos配置中心的命名空间
spring.cloud.nacos.config.namespace=f0fe0beb-7c1f-4808-aa21-5f27509e4af7
#指定nacos配置中心的分组
spring.cloud.nacos.config.group=producter
#指定nacos配置中心的ip地址
spring.cloud.nacos.config.server-addr=192.168.40.59:8848
#指定nacos配置文件格式
spring.cloud.nacos.config.file-extension=properties
启动nacos-discovery,发现端口已经变成1818,成功读取nacos的配置文件
在微服务架构中一个业务流程需要多个微服务通过网络接口调用完成业务处理,服务消费方从服务注册中心获取服 务提供方的地址,从而进行远程调用,这个过程叫做服务发现。
由于微服务架构下各个服务部署的网络、地点、节点个数不同。服务消费方没方法准确记录服务的IP,所以需要一个服务发现中心,动态的获取服务提供方信息。
上面的 producter-discovery 服务配置了 spring.cloud.nacos.discovery.server-addr ,已经在nacos注册了服务。
写一个简单的controller方法
@RestController
@RequestMapping("/Demo")
public class DemoController {
@GetMapping("/nacos")
public String nacos(){
return "producter-1818";
}
}
新建一个 consumer-discovery服务。测试调用producter-discovery接口。pom配置文件和producter-discovery一致。bootstrap.properties内容为
spring.application.name=consumer-discovery
spring.cloud.nacos.discovery.server-addr=192.168.40.59:8848
spring.cloud.nacos.discovery.namespace=f0fe0beb-7c1f-4808-aa21-5f27509e4af7
启动consumer-discovery服务,在nacos查看
@RestController
public class DemoController {
@Resource
private LoadBalancerClient loadBalancerClient;
@GetMapping("Demo")
public String Demo(){
RestTemplate restTemplate = new RestTemplate();
//调用服务
//String providerResult = restTemplate.getForObject("http://localhost:1818/Demo/nacos",String.class);
ServiceInstance serviceInstance = loadBalancerClient.choose("producter-discovery");
URI uri = serviceInstance.getUri();
String providerResult = restTemplate.getForObject(uri+"/Demo/nacos",String.class);
return "consumer invoke | " + providerResult;
}
}
这里可以看到,我们没有记录producter-discovery服务的IP和端口号来,而是通过在nacos注册的服务名来动态的获取服务实例。当该服务名下有多个实例时,loadBalancerClient按照负载均衡的策略获取一个健康的服务实例,然后再通过服务实例的 IP 和端口,调用实例方法,从而完成服务请求。
一般项目中并不会这样调用其他服务的请求,而是使用Dubbo或feign
个人小站:什么是快乐,欢迎访问