从零搭建Spring-Cloud-Alibaba(从构建到发布,更新至nacos)

一、搭建父项目工程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

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配置集群

配置多个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反向代理

linux搭建nginx教程请查看此篇文章

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值