spring cloud alibaba概述
一 . 系统架构的演变
- 单体架构:代码耦合,迭代困难
- 分布式: 各系统存在重叠业余(重复开发)
- SOA: 抽取的粒度大,服务提供方和消费方耦合度高
-
微服务: 单一职责,面向服务
二. Spring Cloud概述
1. 什么是Springcloud?
Spring Cloud是一系列框架的有序集合如服务发现注册、配置中心、消息总线、负载均衡、熔断器、数据监控等
Spring没有重复造轮子,只是基于springboot将其他公司(Netflix)的服务框架组合起来
2. Spring Cloud Alibaba?
同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
作为 Spring Cloud 体系下的新实现,Spring Cloud Alibaba 跟Spring Cloud官方的组件或其它的第三方实现如 Netflix, Consul,Zookeeper 等对比,具备了更多的功能:
SpringCloud = springboot+Netflix
SpringCloud Alibaba= springboot+alibaba
3. Spring Clolud、Spring Cloud Alibaba、SpringBoot的版本关系?(推荐使用)
Spring Boot和Spring Cloud的版本号如下:
Spring Boot版本号:https://spring.io/projects/spring-boot#learn
Spring Cloud版本号:https://spring.io/projects/spring-cloud#learn
Spring Cloud Alibaba版本号:https://spring.io/projects/spring-cloud-alibaba#learn
版本号说明
Spring Cloud是基于Springboot的对应版本号开发的,属于依赖的关系,所以不能都选用最新版本版本关系
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2.2.6.RELEASE | Spring Cloud Hoxton.SR9 | 2.3.2.RELEASE |
注册中心Nacos
一. 什么是Nacos注册中心
注册中心主要有三部分组成:
- Ø Nacos-Server:注册中心
-
提供服务的注册和发现
-
- Ø Nacos-Provider:服务提供方
- 把自身的服务实例注册到 Nacos Server 中
- Ø Nacos-Consumer:服务调用方
- 通过 Nacos Server 获取服务列表,消费服务
二. nacos安装和启动
下载地址:https://github.com/alibaba/nacos/tags
1、解压
tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local
2、启动和关闭
启动:
cd /usr/local/nacos/bin
./starup.sh -m standalone #非集群模式启动
关闭:
cd /usr/local/nacos/bin
./shutdown.sh
三、nacos注册中心(存放服务)
1、服务提供者:nacos_provider
1、pom.xml
spring-cloud-starter-alibaba-nacos-discovery
2、application.yml
spring:
cloud:
nacos:
server-addr: 192.168.116.131:8848 #注册中心的地址
application:
name: nacos-provider #注册到nacos的名字
3、app启动类
@EnableDiscoveryClient2、服务消费者:nacos_consumer
1、pom.xml
spring-cloud-starter-alibaba-nacos-discovery
2、application.yml
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.116.131:8848 #注册中心的地址
application:
name: nacos-consumer #注册到nacos的名字
3、app
@EnableDiscoveryClient
3、为什么要使用注册中心?
①地址硬编码
②不能负载均衡
四、naocs配置中心(存放配置文件)
1、入门案例:nacos_config
1、pom.xml
nacos-config、nacos-discovery、web
2、bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: 192.168.116.131:8848 #配置中心的地址
file-extension: yaml #配置文件扩展名只支持properties和yaml
prefix: nacos-config #文件名,默认是spring.application.name注意:
客户端配置文件的名称必须为
bootstrap.yml
bootstrap/ application 的应用场景:
bootstrap.yml
比applicaton.yml
优先加载,应用于系统级别参数配置,一般不会变动;
application.yml
应用于SpringBoot项目的自动化配置
3、在nacos中创建配置文件
Data ID:prefix.file-extension
配置格式:yaml或properties2、为什么要用配置中心?
①集中管理配置文件
②动态更新配置文件
3、隔离模型
namespace --------------------------环境:dev、test、prodgroup --------------------------项目名:health、jd
Data ID --------------------------工程名:nacos-config.yaml health-provider.yaml
获取配置集需要指定:
nacos服务地址,必须指定
namespace,如不指定默认public
group,如不指定默认 DEFAULT_GROUP
dataId,必须指定
五、持久化
1.为什么要持久化?(集群模式下数据统一)
Nacos默认有自带嵌入式数据库derby,但是如果做集群模式的话,就不能使用自己的数据库不然每个节点一个数据库,那么数据就不统一了,需要使用外部的mysql
2.持久化入门操作
2.1 切换数据库
修改nacos存放路径下的conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql,版本要求:5.6.5+)
### If use MySQL as datasource: spring.datasource.platform=mysql ### Count of DB: db.num=1 ### Connect URL of DB: db.url.0=jdbc:mysql://192.168.31.19:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=1111
2.2 初始化数据库
2.2.1、创建nacos库(配置文件默认库名为:nacos ,可在application.properties文件中进行修改)
注意:库名和application.properties中的库名保持一致
2.2.2、创建所需表
找到conf/nacos-mysql.sql文件并执行例如:
2.2.3、测试--测试之前mysql要先启动,否则启动不了
1、重启nacos服务
2、打开浏览器输入nacos地址,在新建配置新建配置文件
3、观察配置文件是否持久化到mysql中
六、集群
1. 什么是集群?
同一个业务,部署在多个服务器上(不同的服务器运行同样的代码,干同一件事)
2. 集群的搭建(只是模拟一下效果,在一台虚拟机开了三个服务)
1.找到nacos安装路径下的conf/cluster.conf.example,将其改名为 conf/cluster.conf
2.打开 conf/cluster.conf文件,添加信息
# ip:port
192.168.128.132:8848
192.168.128.132:8849
192.168.128.132:8850
3. 将nacos安装目录复制三份
[root@localhost bin]# cd /usr/local
[root@localhost java]# mkdir nacos_cluster
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8848
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8849
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8850
4.将复制的三份文件中 conf/application.properties
中的端口号分别改为:
server.port=8848
server.port=8849
server.port=8850
七、配置代理服务Nginx
1. 什么是Nginx?
Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
2. Linux系统安装Nginx(可跟nacos安装到同一台虚拟机中)
1.由于nginx采用C进行编写,首先需要安装nginx的依赖库
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
2. 下载nginx
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
3. 解压安装包
tar -zxvf nginx-1.12.0.tar.gz
4.配置nginx安装包、
cd nginx-1.12.0
./configure --prefix=/usr/local/nginx
注意:
./configure配置nginx安装到/usr/java/nginx目录下
5.编译并安装
make && make install
3.配置nginx代理nacos
1. 打开nginx安装路径下的conf/nginx.conf文件
#将要代理的tomcat服务器的地址以及权重(weight是权重,权重越大,分配的几率越大)
#行号的第34行附近插入数据
upstream nacos {
server 192.168.128.132:8848;
server 192.168.128.132:8849;
server 192.168.128.132:8850;
}server {
listen 80;
server_name localhost;
location / {#行号54行附近插入数据
#配置nginx的代理
proxy_pass http://nacos;
}
}
4.测试
1. 启动nacos集群
[root@localhost upload]# cd /usr/local/nacos_cluster/nacos_8848/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8849/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8850/bin
[root@localhost bin]# ./startup.sh
2.启动nginx
[root@localhost nginx]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ./nginx
3.案例准备
-
创建springcloud_parent
- 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.bjpowernode</groupId>
<artifactId>springcloud_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<!-- 项目源码及编译输出的编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 项目编译JDK版本 -->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<!--Spring Boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Netflix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud 阿里巴巴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
- 创建nacos_config
- 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">
<parent>
<artifactId>springcloud_parent</artifactId>
<groupId>com.bjpowernode</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos_config</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
</project>
- bootstrap.yml
spring:
application:
name: nacos-confing
cloud:
nacos:
discovery:
server-addr: 192.168.128.132:81 #nginx绑定的域名 nginx默认的端口的是80,我这里使用的是81端口
config:
server-addr: 192.168.128.132:81 #nginx绑定的域名 nginx默认的端口的是80,我这里使用的是81端口
file-extension: yaml #后缀名
prefix: nacos-config #文件名
- App
-
package com.bjpowernode; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient //向注册中心注册该服务,并可以获取其他服务的调用地址 public class NacosConfigApp { public static void main(String[] args) { SpringApplication.run(NacosConfigApp.class); } }
-
controller
package com.bjpowernode.controller;
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;
@RestController
@RefreshScope //重新从BeanFactory获取一个新的实例(该实例使用新的配置)
public class ConfigController {
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.type}")
private String type;
@GetMapping("/config/info")
public String getConfig(){
System.out.println(this);
String configInfo = driverClassName+"<br>"+url+"<br>"+username+"<br>"
+password+"<br>"+type;
return configInfo;
}
}
4.往Nacos添加配置信息
- 新建配置文件
- 添加配置文件
- 内容如下:
server:
port: 81
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.128.130:3306/health?characterEncoding=UTF-8
username: root
password: 1234
type: com.alibaba.druid.pool.DruidDataSource
5.测试
启动nacos-confing服务
通过nginx访问nacos集群:http://192.168.128.132/nacos
浏览器访问http://127.0.0.1:81/config/info
八、Nacos开机自启
1. 编写开机启动文件
-
添加nacos.service文件(打开终端新建文件)
vim /lib/systemd/system/nacos.service (文件位置不可变)
-
文件内容如下:
[Unit]
Description=nacos
After=network.target[Service]
Type=forking
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone #nacos安装路径
ExecReload=/usr/local/nacos/bin/shutdown.sh #nacos安装路径
ExecStop=/usr/local/nacos/bin/shutdown.sh #nacos安装路径
PrivateTmp=true[Install]
WantedBy=multi-user.target
-
修改nacos的startup.sh
-
修改JAVA_HOME路径并注销之后的3行配置,如下:
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_191 #jdk安装路径
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
#[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME
-
设置开机启动
systemctl daemon-reload #重新加载服务配置
systemctl enable nacos.service #设置为开机启动
systemctl start nacos.service #启动nacos服务
systemctl stop nacos.service #停止nacos服务