文章知识来源主要来源于:赵俊夫先生的博客 以下为原文链接
https://blog.csdn.net/u011177064/category_9572944.html
1: Nacos介绍
Nacos是阿里巴巴最新开源的项目,核心定位是“一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台”,项目地址:https://nacos.io/zh-cn/
Nacos核心提供两个功能:服务注册与发现,动态配置管理。
1:服务注册与发现
Nacos提供基于DNS和基于RPC的服务发现,即能被用来支持https/http的服务注册与发现,也支持RPC如dubbo的服务注册与发现
现在阿里官方也推荐使用Nacos来代替Zookeeper。
与Dubbo使用的zookeeper相比而言,还是有挺大的差别的 ,zookeeper是一种分布式的协调服务,
它天生是作为分布式数据一致性场景下的解决方案,它牺牲了可用性来保证一致性(master选举期间服务会对外停止)
而Nacos是一种去中心化的架构。
2:动态配置服务
动态修改配置并实时生效对于服务端的同学而已并不陌生,这种服务能够让我们的服务拥有更多的灵活性,
不需要重启服务即可做到配置实时生效,非常适合于“配置优先”的服务开发。
注意:SpringCloud默认的注册中心 Eurka 已经停止更新
2: Nacos的安装
见以下链接:
Docker安装Nacos
https://www.jianshu.com/p/d2c81d647323
3:注册发现流程
1:创建 服务1 consumer
2:创建 服务2 provider
3:nacos 作为 服务注册发现中心
流程:
1:consumer 注册到 nacos
2:provider 注册到 nacos
3:http 调用 consumer
在consumer的逻辑中通过loadBalancerClient 获取nacos 里的provider的信息
通过provider的信息拼装成url
请求该url
4:http 返回结果为调用provider的结果
3:Pom文件 (provider 与 consumer)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<spring.boot.version>2.1.0.RELEASE</spring.boot.version>
<spring.cloud.version>Greenwich.SR2</spring.cloud.version>
<spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!-- spring-boot-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud-alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入lombok 使用@Data注解 使用@Slf4j注解-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 使用alibaba的 json转换-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<!-- 排除junit5单元测试的maven包 -->
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
4:yml配置文件
server:
port: server-port
spring:
application:
name: nacos-name
cloud:
nacos:
discovery:
server-addr: nacos-host:nacos-port
management:
endpoints:
web:
exposure:
include: "*"
5:Consumer主要逻辑
@RestController
@Slf4j
public class NacosConsumerApi {
@Value("${spring.application.name}")
private String appName;
@Autowired
private LoadBalancerClient loadBalancerClient;
private RestTemplate restTemplate = new RestTemplate();
@GetMapping(value = "/nacos/{string}")
public String nacos(@PathVariable String string) {
//使用LoadBalanceClient的方式来获取 nacos-provider的服务信息
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
log.info( "打印serviceInstance信息:{}",JSONObject.toJSONString(serviceInstance));
// 对将要请求的url进行组装
String url = String.format("http://%s:%s/nacos/%s", serviceInstance.getHost(), serviceInstance.getPort(),
appName);
http://192.168.137.1:9991/nacos/nacos-consumer
log.info("你好,我是请求的url request url:{}" , url);
//注意这里面 restTemplate.getForObject 已经进行了一次请求
log.info( "打印返回信息:{}",JSONObject.toJSONString(restTemplate.getForObject(url, String.class)));
return restTemplate.getForObject(url, String.class);
}
}
6:Provider主要逻辑
@RestController
@Slf4j
public class NacosProviderApi {
@GetMapping(value = "/nacos/{string}")
public String nacos(@PathVariable String string) {
log.info("请求到服务发现端 /nacos/{string} 的接口");
return "Hello Nacos Discovery " + string;
}
}
7:Nacos界面与测试效果
项目连接
请配合项目代码食用效果更佳:
项目地址:
https://github.com/hesuijin/spring-cloud-alibaba-project
Git下载地址:
https://github.com.cnpmjs.org/hesuijin/spring-cloud-alibaba-project.git
在service-provider-demo 模块下
在service-consumer-demo 模块下
网友评论