1、什么是Spring Cloud
Spring Cloud是一系列框架的集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
2、微服务和微服务架构
微服务就是微小的服务,通过微服务思想,将原有的大而全的项目拆分成多个小而巧的项目,每个小的项目就是一个微服务,若干个微服务组成一个完整项目。微服务架构就是利用这种思想搭建的项目架构方式。
微服务架构可以提供高并发、高吞吐、高可用的特性。
3、什么是Nacos
Redirecting to: https://nacos.io/ 参考官方文档,不过多赘述。
nacos的两个核心功能:注册中心(发现中心)、配置中心(配置管理)
阿里旗下产品。Nacos是Spring Cloud Alibaba的开源组件之一,它不仅可以像Consul、Eureka那样作为注册中心,还可以像Spring Config那样作为远程的配置中心,并且,它还有很多自己的特性。
Nacos是一个开源的动态服务发现、配置管理和服务管理平台,由阿里巴巴集团开发并开源。它主要提供以下功能:
1. **服务注册与发现**:Nacos允许服务在注册中心中注册自己,并通过服务名来发现其他服务,有助于实现微服务架构中的服务间通信。
2. **配置管理**:提供了统一的配置管理平台,可以管理和动态更新分布式系统中的配置信息,如数据库连接、参数设置等。
3. **动态DNS服务**:支持动态DNS服务,允许根据服务名动态解析到具体的IP地址,为服务调用提供更灵活的选择。
4. **服务健康监测**:提供了健康检查功能,可以监测注册的服务是否健康,自动剔除不健康的实例。
5. **权重和流量管理**:支持灰度发布和流量管理,可以实现不同版本的服务之间的流量切分和管理。
Nacos支持主流的服务生态,如Kubernetes Service、gRPC/Dubbo RPC Service或者Spring Cloud RESTful Service。它还支持服务元数据管理,包括服务端点、服务标签、服务版本号、服务实例权重、路由规则、安全策略等。
Nacos的架构包括服务注册中心、配置中心和动态DNS服务。服务注册中心是服务、其实例及元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。
Nacos的客户端和服务器端交互包括客户端定时拉取服务端注册实例数据,以及服务端推送机制,当服务端注册数据发生变化时,通过UDP推送到客户端。
此外,Nacos还提供了一些简单的DNS APIs帮助管理服务的关联域名和可用的IP:PORT列表,支持权重路由,实现负载均衡和流量控制。
Nacos的快速开始手册提供了如何在电脑上下载、安装并使用Nacos的指导,包括启动服务器、服务注册与发现、配置管理和关闭服务器的命令。
总的来说,Nacos是一个功能丰富的服务发现和管理平台,适用于构建和管理微服务架构。
4、Nacos应用
1、基于Docker安装
#拉取docker镜像:
docker pull nacos/nacos-server:1.3.1
#创建挂载目录:
mkdir -p /usr/local/docker/nacos/init.d /usr/local/docker/nacos/logs
#安装nacos:
docker run -d \
-p 8848:8848 \
-e MODE=standalone \
-e PREFER_HOST_NAME=hostname \
-v /usr/local/docker/nacos/init.d:/home/nacos/init.d \
-v /usr/local/docker/nacos/logs:/home/nacos/logs \
--name nacos nacos/nacos-server:1.3.1
-e MODE=standalone:运行模式为单例模式,nacos支持集群,当前用单例运行
-e PREFER_HOST_NAME=hostname:以主机名启动,也可以用ip地址
2、注册中心
idea创建一个mavn项目
1.添加pom.xml依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jr</groupId>
<artifactId>nacos</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.7.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.13</spring-boot.version>
<jwt.version>0.7.0</jwt.version>
<fastjson.version>1.2.60</fastjson.version>
<spring-cloud-alibaba.version>2.0.3.RELEASE</spring-cloud-alibaba.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--json-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.编写bootstrap.yml配置文件:
是配置注册中心的,要优先于application.yml文件读取。
#server-addr: 192.168.146.128:8848 端口号和虚拟机端口
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.146.128:8848
3.编写application.properties配置文件:
给当前工程取的名,用于在nacos中显示和管理。
spring.application.name=nacos01
4.编写启动类
package com.jr;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootMain {
public static void main(String[] args) {
SpringApplication.run(SpringBootMain.class);
}
}
如果不好用把启动器换到重com下换到jr下【主要启动器包的位置很重要】
http://192.168.146.128:8848/nacos/#/login 用自己的ip
3、配置中心
【1、创建或修改application.yml】
##修改端口号
server:
port: 99
common:
name: zhangsan
age: 20
【2、创建控制器】
package com.jr.controller;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value; //注意这一项
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
@Setter
public class UserController {
@Value("${common.name}")
private String name;
@Value("${common.age}")
private Integer age;
@GetMapping
public String test(){
return name+"----"+age;
}
}
【3、启动,访问】
【4、添加maven依赖】在pom.xml中
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
【5、创建命名空间】
【注意:上图里的‘命名空间ID’,一会粘贴在idea项目配置文件中。】
【6、配置中心添加配置文件】
【注意:下图中的Data ID ,为自定义。但是要有.yaml后缀】
common:
name: lisi
【在配置一个】
common:
age: 25
【7、修改bootstrap.yml配置文件】
#server-addr: 192.168.146.128:8848 端口号和虚拟机端口
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.146.128:8848
config:
server-addr: 192.168.146.128:8848
file-extension: yaml
namespace: eeb6168d-fa2b-4d8e-9ba4-c6dc0e5a937a
shared-configs:
- data-id: gb1.yaml
group: DEFAULT_GROUP
- data-id: gb2.yaml
group: DEFAULT_GROUP
inetutils:
preferred-networks: 192.168.146
【注意这是我笔记图片,和本片文章ip id 网段 并不匹配】
此图主要告知每个位置写什么
server-addr:nacos服务ip及端口
file-extension:配置文件类型
namespace:命名空间,在nacos页面中创建,用来管理配置文件
shared-configs:配置中心配置
data-id:配置文件唯一标识
group:配置文件分组
preferred-networks:设置微服务的网段
【8、查看上步操作中,获得注册中心里的网段】
192.168.146.55(我的这次做的)
注意我的这张图和我的对不上,这是我笔记里面的截图
【9、重新启动项目,再次访问】
获得配置中心里的值了。(配置中心里有的值,读配置中心;配置中心没有的值,读本地;本地也没有,报错。)
localhost:99/user (端口号/@RequestMapping("/user")控制层路由)