一、搭建父项目工程Spring-Cloud-Alibaba
打开idea,File ->New->Project->Maven->next->Spring-Cloud-Alibaba(父工程名字)->Finish
二、添加Pom依赖
SpringBoot与SpringCloud之间存在版本依赖,版本不一致会导致版本冲突或者出现组件不支持的情况
以下项目springboot版本使用2.3.2.RELEASE,springcloud版本使用Hoxton.SR9,springcloud-alibaba版本使用2.2.6.RELEASE
<?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>org.example</groupId>
<artifactId>Spring-Cloud-Alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>common</module>
<module>order</module>
<module>stock</module>
<module>order-ribbon</module>
<module>stock-nacos</module>
<module>nacos-config</module>
<module>sentinel-demo</module>
<module>sentinel-order</module>
</modules>
<!--主项目不需要打成jar包 所以修改为pom方式-->
<packaging>pom</packaging>
<!--版本统一管理-->
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<mysql.version>8.0.22</mysql.version>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.18.12</lombok.version>
<mysql.version>8.0.22</mysql.version>
<druid.verison>1.2.11</druid.verison>
<spring-boot.verison>2.3.2.RELEASE</spring-boot.verison>
<spring-cloud-alibaba.verison>2.2.6.RELEASE</spring-cloud-alibaba.verison>
<druid.verison>1.2.11</druid.verison>
<mybatis.spring.boot.version>2.1.2</mybatis.spring.boot.version>
</properties>
<dependencyManagement>
<!-- springCloud alibaba的版本挂你,通过dependency完成继承 -->
<!-- SpringCloudAlibaba(2.2.6.RELEASE) Spring Cloud(Hoxton.SR9) springBoot(2.3.2.RELEASE) -->
<!--springBoot 2.3.12-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.verison}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud-dependencies Hoxton.SR9 -->
<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 2.2.6.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.verison}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.verison}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.2.RELEASE</version>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
三、搭建Java环境
本人是从零开始搭建的,所以系统环境也是从零搭建的,已有环境的兄弟们,就可以跳过此内容。想自己搭建的可以购买云服务器自己动手搭建,后续会涉及到一些端口号安全组的开放。个人是用新号买的阿里云的新客优惠,链接如下:花钱通道
jdk安装
linux jdk1.8安装包文件
提取码:cynl
1、解压安装包
将jdk1.8的安装包上传到服务器/usr/local/lib/java目录下,首先需要创建java目录。(个人可以自定义安装目录)
解压命令:tar -zxvf jdk-8u281-linux-x64.tar.gz
2、配置JDK环境变量
vi /etc/profile
export JAVA_HOME=/usr/local/lib/java/jdk1.8.0_281
export CLASSPATH= : C L A S S P A T H : :CLASSPATH: :CLASSPATH:JAVA_HOME/lib/
export PATH= P A T H : PATH: PATH:JAVA_HOME/bin
3、刷新环境变量使其生效
source /etc/profile
4、 查看JDK是否安装成功,出现jdk版本则已安装成功
java -version
安装maven
maven官网下载链接
maven安装包提取链接
提取码:cynl
将Maven的安装包上传到服务器/usr/local/lib/java下,首先创建java目录
1、 解压Maven安装包
tar -zxvf apache-maven-3.8.6-bin.tar.gz
2、 配置环境变量
vi /etc/profile
# maven版本号与自己下载的需要对应
export MAVEN_HOME=/usr/local/lib/java/apache-maven-3.8.6
export PATH=$MAVEN_HOME/bin:$PATH
3、 刷新环境变量使其生效
source /etc/profile
4、 检查版本
mvn -v
四、搭建Nacos
这里下载的是1.4.2的版本,将nacos的安装报上传到服务器/usr/local/lib/java下,首先创建java目录
nacos安装包提取链接
提取码:cynl
1、解压nacos安装包
tar -zxvf nacos-server-1.4.2.tar.gz
2、将解压后的文件放到服务器/usr/local文件夹下
mv nacos /usr/local
3、配置nacos启动脚本jdk路径
cd /usr/local/nacos/bin
vi startup.sh
export JAVA_HOME=/usr/local/lib/java/jdk1.8.0_281 # 指定jdk路径
4、修改nacos /usr/local/nacos/conf目录下application.properties数据库配置,默认注释,需要在数据库新建一个nacos的库,用于存放nacos用户、配置等相关信息
cd /usr/local/nacos/conf
vi application.properties
修改配置文件中的数据库链接
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=xxxx
db.password.0=xxxx
5、导出/usr/local/nacos/conf目录下的,nacos-mysql.sql脚本,到数据库执行一下,生成对应的表。(初始化nacos库所需表结构)
6、启动,nacos默认端口号为8848,如需修改,则需要修改application.properties配置文件中server.port=xxxx配置,还需要放开服务器安全组规则添加对应nacos端口号,不然会导致请求失败。
6.1 单机启动
cd /usr/local/nacos/bin
sh startup.sh -m standalone
6.2 停止
sh shutdown.sh
项目集成Nacos
1、新建一个子项目:stock-nacos
new -> Module -> Maven -> stock-nacos -> Finish
2、 添加pom依赖
<?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>Spring-Cloud-Alibaba</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>stock-nacos</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--spring boot 启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
3、新建application.yml文件
server:
port: 8013
spring:
application:
name: service-stock
cloud:
nacos:
discovery:
#server-addr: ip:port
server-addr: ip:port
username: nacos #不配置默认就是nacos
password: nacos #不配置默认就是nacos
namespace: public
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://ip:3306/xx?characterEncoding=utf8&useSSL=true&serverTimezone=GMT&serverTimezone=Asia/Shanghai
username: xxxx
password: xxxx
4、新建实现类,新增接口模拟扣减库存
package com.chong.controller;
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;
/**
* @author cy
* @date 2022/8/20 11:59
*/
@RestController
@RequestMapping("/stock")
public class StockController {
@Value("${server.port}")
private String port;
@GetMapping("/deductionStock")
public String deductionStock() {
System.out.println("库存扣减成功");
return "下单被调用:" + port;
}
}
5、新建一个子项目order-nacos
new -> Module -> Maven -> order-nacos -> Finish
6、添加pom依赖
<?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>Spring-Cloud-Alibaba</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>order</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos注解-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
7、新建application.yml配置文件
server:
port: 8012
spring:
# 应用名称 (nacos会讲该名称当作服务名称)
application:
name: order-nacos
cloud:
nacos:
discovery:
#server-addr: ip:port
# 配置nginx反向代理集群端口 8854
server-addr: ip:port
username: nacos #不配置默认就是nacos
password: nacos #不配置默认就是nacos
namespace: public # 命名空间
#ephemeral: false # 永久实例, 服务宕机了也nacos不会将实例删除
#group: DEFAULT_GROUP # 服务分组 DEFAULT_GROUP 默认分组
#weight: 1 # 权重 1-100 数值越大,访问权重越大
# metadata: # 元数据空间
# preserved.heart.beat.interval: 1000 #该实例在客户端上报心跳的间隔时间。(单位:毫秒)
# preserved.heart.beat.timeout: 3000 #该实例在不发送心跳后,从健康到不健康的时间。(单位:毫秒)
# preserved.ip.delete.timeout: 3000 #该实例在不发送心跳后,被nacos下掉该实例的时间。(单位:毫秒)
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://ip:3306/xx?characterEncoding=utf8&useSSL=true&serverTimezone=GMT&serverTimezone=Asia/Shanghai
username: xxxx
password: xxxx
8、新建实现类OrderController,利用RestTemplate Http请求的同步阻塞式工具类
package com.chong.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
* 订单控制类
* @author cy
* @date 2022/8/18 18:00
*/
@RestController
@RequestMapping("/order")
public class OrderController {
@Resource
RestTemplate restTemplate;
@GetMapping("/addOrder")
public String placeAnOrder() {
System.out.println("下单成功");
// 远程调用
String forObject = restTemplate.getForObject("http://service-stock/stock/deductionStock", String.class);
return "远程调用成功" + "-" + forObject;
}
}
9、新建启动类,启动之后通过nacos会自动注册服务,访问接口实现远程接口调用,成功即集成nacos成功。
package com.chong;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* 订单控制类
* @author cy
* @date 2022/8/20 12:13
*/
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* Http请求远程同步阻塞式工具类
* @return RestTemplate
*/
@Bean
@LoadBalanced // 负载均衡 nacos内部集成了Ribbo
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
五、Ncos心跳机制
metadata与discovery同级
metadata:
preserved.heart.beat.interval: 1000 #该实例在客户端上报心跳的间隔时间。(单位:毫秒)
preserved.heart.beat.timeout: 3000 #该实例在不发送心跳后,从健康到不健康的时间。(单位:毫秒)
preserved.ip.delete.timeout: 3000 #该实例在不发送心跳后,被nacos下掉该实例的时间。(单位:毫秒)
六、Nacos持久化实例(永久实例)
持久化实例启动时向nacos注册,nacos会对这个实例进行持久化处理
心跳包的规则和临时实例一致,只是不会将该服务从列表中剔除
配置如下:
discovery:
ephemeral: false # 永久实例, 服务宕机了也nacos不会将实例删除
七、雪崩保护
Nacos客户端可以配置服务的保护阈值,如果健康实例/总实例<保护阈值,就在洪峰流量到来之后,会将不健康的实例也会提供使用,但是会返回异常,就不会把流量全打在健康的实例上面。
八、Nacos配置集群
配置多个nacos服务
1、复制多个nacos文件夹
cd /usr/local/lib/java
tar -zvxf nacos-server-1.4.2.tar.gz
mv nacos /usr/local/nacos_8848
tar -zvxf nacos-server-1.4.2.tar.gz
mv nacos /usr/local/nacos_8850
tar -zvxf nacos-server-1.4.2.tar.gz
mv nacos /usr/local/nacos_8852
2、 修改数据库配置文件
cd nacos_8852/conf
vi application.properties
修改port端口号
数据库连接
3、修改集群配置,首先复制一个,改为集群的配置端口
# 修改配置文件名称为cluster.conf
cp cluster.conf.example cluster.conf
vi cluster.conf
服务器ip:8848
服务器ip:8850
172.27.55.141:8852
4、修改启动方式,默认集群方式(Mode参数)
cd /bin
vi startup.sh
export MODE="cluster"
export JAVA_HOME=/usr/local/lib/java/jdk1.8.0_281 指定jdk路径
可以修改内存配置,默认2g 2g 1g
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512M -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
5、 修改一个服务的配置文件,然后复制到其他项目
cp /usr/local/nacos_8848/conf/application.properties /usr/local/nacos_8850/conf/application.properties
需要修改对应服务端口
cp /usr/local/nacos_8848/conf/cluster.conf /usr/local/nacos_8850/conf/cluster.conf
cp /usr/local/nacos_8848/bin/startup.sh /usr/local/nacos_8852/bin/startup.sh
6、 nginx配置nacos反向代理
cd /usr/local/nginx/conf
vi nginx.conf
upstream nacosServer{
server 服务器ip:8848;
server 服务器ip:8850;
server 服务器ip:8852;
}
server {
listen 8854;
server_name 服务器ip;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://nacosServer/;
index index.html index.htm;
}
}
7、 配置的nginx代理nacos端口尾8854,云服务器安全组需要配置8854端口
8、 修改项目yml配置文件,nacos:server-addr
# 配置nginx反向代理集群端口 8854
server-addr: 服务器ip:8854
启动服务注册到nacos,就是以轮询的方式,不同服务注册到不同nacos节点上,查看日志可以发现,默认5s中发送一次心跳
/usr/local/nacos_8852/bin/logs
tail -fn 100 access_log.2022-08-23.log
服务器ip - - [23/Aug/2022:21:10:11 +0800] "PUT /nacos/v1/ns/instance/beat?app=unknown&namespaceId=public&port=8012&clusterName=DEFAULT&ip=192.168.1.55&serviceName=DEFAULT_GROUP%40%40service-order&accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY2MTI3Nzk5M30.0581TZYqh65xreh8BIGwsNPN-isuzwpMOztV0NmfARE&encoding=UTF-8&nofix=1 HTTP/1.1" 200 75 1 Nacos-Server:1.4.2 服务器ip:8850