SpringCloudAlibaba - 项目完整搭建(Nacos + OpenFeign + Getway + Sentinel)

目录

[一、SpringCloudAlibaba 项目完整搭建](#一、SpringCloudAlibaba 项目完整搭建)

1.1、初始化项目

1.1.1、创建工程

[1.1.2、配置父工程的 pom.xml](#1.1.2、配置父工程的 pom.xml)

1.1.3、创建子模块

[1.2、user 微服务](#1.2、user 微服务)

[1.2.1、配置 pom.xml](#1.2.1、配置 pom.xml)

[1.2.2、创建 application.yml 配置文件](#1.2.2、创建 application.yml 配置文件)

1.2.3、创建启动类

1.2.4、测试

[1.3、product 微服务](#1.3、product 微服务)

[1.3.1、配置 pom.xml](#1.3.1、配置 pom.xml)

[1.3.2、创建 application.yml 配置文件](#1.3.2、创建 application.yml 配置文件)

1.3.3、创建启动类

1.3.4、测试

[1.4、引入 OpenFeign,进行远程调用](#1.4、引入 OpenFeign,进行远程调用)

1.4.1、引入依赖

1.4.2、实现远程调用

[1.5、user 微服务集成 Sentinel](#1.5、user 微服务集成 Sentinel)

[1.5.1、引入 sentinel 依赖](#1.5.1、引入 sentinel 依赖)

[1.5.2、在 application.yml 中配置 sentinel](#1.5.2、在 application.yml 中配置 sentinel)

1.5.3、测试

1.6、网关微服务

[1.6.1、配置 pom.xml](#1.6.1、配置 pom.xml)

[1.6.2、创建 application.yml 并配置网关](#1.6.2、创建 application.yml 并配置网关)

1.6.3、创建启动类

1.6.4、测试

[1.7、nacos 实现配置中心](#1.7、nacos 实现配置中心)

1.7.1、建议

[1.7.2、引入 nacos 配置中心依赖](#1.7.2、引入 nacos 配置中心依赖)

[1.7.3、在 nacos 上创建配置](#1.7.3、在 nacos 上创建配置)


一、SpringCloudAlibaba 项目完整搭建


1.1、初始化项目

1.1.1、创建工程

a)先创建一个空项目,名字自定义.

Ps:

  1. 这里也可以不创建空项目,而是直接创建一个 Maven 项目作为父项目,然后删掉 src 目录即可.

  2. 还有一种更方便的管理办法,就是直接创建一个 Spring Boot 项目做为父项目,这样就可以提前引入好依赖,然后只留下 pom.xml 、.gitinore 、.idea 即可.

b)在刚刚的空项目下创建整个项目的父模块

c)父工程下的 src 可以删了,没用

d)最后直接用 IDEA 打开空项目下的父工程(否则 Java 文件不生效)

1.1.2、配置父工程的 pom.xml

a)引入依赖如果没有语法提示,可以这样添加索引

b)配置依赖如下

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>org.example</groupId>
    <artifactId>springcloud_alibaba_parent</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--配置版本信息-->
    <properties>
        <java.version>8</java.version>
        <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
    </properties>


    <!--parent-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
    </parent>

    <dependencies>
        <!--基本上每个项目都需要日志-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <!--管理依赖规范-->
    <dependencyManagement>
        <dependencies>

            <!-- springCloud -->
            <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>

</project>

Ps:SpringCloud Alibaba 、SpringCloud、SpringBoot 各版本对应说明 如下

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

例如按照上述文档,这里给出一个更新的版本样式(稳定).

XML 复制代码
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


    <properties>
        <java.version>1.8</java.version>
        <mybatis-spring-boot.version>2.3.1</mybatis-spring-boot.version>
        <mysql.version>5.1.49</mysql.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
    </properties>

    <!--维护依赖-->
    <dependencyManagement>
        <dependencies>

            <!-- 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>

            <!--mybatis-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis-spring-boot.version}</version>
            </dependency>

            <!--mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

            <!--spring-boot-test-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>

            <!--mybatis-test-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter-test</artifactId>
                <version>${mybatis-spring-boot.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

1.1.3、创建子模块

在父工程下创建 4 个 module

  • user:用户微服务(案例).
  • product:商品微服务(案例).
  • gateway:网关微服务.
  • model:模组微服务,用来管理实体类,公共依赖(例如 user 微服务和 product 微服务中都需要 spring web 依赖,那么只需要将这个依赖放到 model 中,然后在 user 和 product 中分别引入 model 模块即可)

1.2、user 微服务

1.2.1、配置 pom.xml

用户微服务所需依赖如下(按需引入):

XML 复制代码
    <dependencies>

        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--openFeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>


    </dependencies>

Ps:不要一开始就引入这么多,按需引入!尤其是 nacos config配置 依赖,如果引入不使用就会报错!

1.2.2、创建 application.yml 配置文件

配置端口号,以及 nacos 地址

bash 复制代码
server:
  port: 8090

spring:
  application:
    name: user
  cloud:
    nacos:
      server-addr: localhost:8890

1.2.3、创建启动类

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient // nacos 服务发现(可以省略)
public class UserApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }

}

启动 user 微服务,就可以看到 nacos 中存在该服务了

1.2.4、测试

创建 UserController,如下

java 复制代码
@Slf4j
@RestController
@RequestMapping
public class UserController {

    @Value("${server.port}")
    private int port;

    @GetMapping("/user")
    public String user() {
        log.info("user ok!  port={}", port);
        return "user ok! port=" + port;
    }

}

postman 测试结果如下:

1.3、product 微服务

1.3.1、配置 pom.xml

用户微服务所需依赖如下(按需引入):

XML 复制代码
    <dependencies>

        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--openFeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>


    </dependencies>

Ps:不要一开始就引入这么多,按需引入!尤其是 nacos config配置 依赖,如果引入不使用就会报错!

1.3.2、创建 application.yml 配置文件

配置端口号,以及 nacos 地址

bash 复制代码
server:
  port: 8091

spring:
  application:
    name: product
  cloud:
    nacos:
      server-addr: localhost:8890

1.3.3、创建启动类

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient //可省略
public class ProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class, args);
    }

}

启动 user 微服务,就可以看到 nacos 中存在该服务了

1.3.4、测试

创建 UserController,如下

java 复制代码
@Slf4j
@RestController
@RequestMapping
public class UserController {

    @Value("${server.port}")
    private int port;

    @GetMapping("/user")
    public String user() {
        log.info("user ok!  port={}", port);
        return "user ok! port=" + port;
    }

}

postman 测试结果如下:

1.4、引入 OpenFeign,进行远程调用

1.4.1、引入依赖

在 user 微服务中引入 openfeign 依赖(这里只是举例,实际开发中,按需引入).

XML 复制代码
        <!--openFeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

注意:由于SpringCloud Feign高版本(例如 springcloud 2021.0.1)不使用Ribbon而是使用spring-cloud-loadbalancer,所以需要引用spring-cloud-loadbalancer或者降版本

XML 复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

1.4.2、实现远程调用

a)在 user 微服务中创建一个 product 微服务 feign 接口

java 复制代码
@FeignClient("product")
public interface ProductClient {

    @GetMapping("/product")
    String product();

}

b)在启动类中开启 feign 客户端

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient // nacos 服务发现(可以省略)
@EnableFeignClients // 开启 openfeign 远程调用
public class UserApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }

}

c)如果是高版本的 SpringCloud,那么就需要使用 SpringCloud LoadBalencer 做负载均衡.

具体的添加@LoadBalancerClient注解:在调用服务的Service类上添加@LoadBalancerClient注解,并指定服务名。这样,负载均衡器将根据配置的属性来选择合适的服务实例进行调用。例如:

如下:

java 复制代码
@FeignClient(value = "service-name", configuration = LoadBalancerClientConfig.class)  
public interface MyService {  
    @LoadBalanced  //启用负载均衡
    @GetMapping("/endpoint")  
    String getEndpointData();  
}

d)在 UserController 中进行远程调用.

java 复制代码
    @GetMapping("/user")
    public String user() {
        log.info("user ok!  port={}", port);
        //远程调用 product
        String result = productClient.product();
        log.info("远程调用 result: {}", result);
        return "user ok! port=" + port;
    }

执行结果如下:

1.5、user 微服务集成 Sentinel

1.5.1、引入 sentinel 依赖

在 user 微服务中引入 sentinel 依赖

XML 复制代码
        <!--sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

1.5.2、在 application.yml 中配置 sentinel

XML 复制代码
server:
  port: 8090

spring:
  application:
    name: user
  cloud:
    nacos:
      server-addr: localhost:8890
    sentinel:
      eager: true # 立即触发 sentinel
      transport:
        dashboard: localhost:8891

1.5.3、测试

a)打开 sentinel 控制台

b)设置流控规则为 1秒 / 3次点击.

c)测试后限流生效

1.6、网关微服务

1.6.1、配置 pom.xml

XML 复制代码
    <dependencies>

        <!--gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!--nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

    </dependencies>

如果使用的是 springcloud高版本(例如 2020.1.0),那么 gateway 中的 ribbon 负载均衡已经被剔除了,因此需要引入 springcloud loadbalencer 作为 gateway 的负载均衡.

XML 复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

引入此依赖后,可能还会报 cache 的警告,引入一下两个依赖即可

XML 复制代码
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>

1.6.2、创建 application.yml 并配置网关

XML 复制代码
server:
  port: 18080

spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8890
    gateway:
      routes:
        - id: users_router
          # uri: http://localhost:9090 无负载均衡
          uri: lb://user  # lb 表示负载均衡
          predicates:
            - Path=/user

        - id: products_router
          # uri: http://localhost:9091
          uri: lb://product
          predicates:
            - Path=/product

另外,如果配置跨域,如下:

XML 复制代码
server:
  port: 18080

spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8890
    gateway:
      routes:
        - id: users_router
          # uri: http://localhost:9090 无负载均衡
          uri: lb://user  # lb 表示负载均衡
          predicates:
            - Path=/user

        - id: products_router
          # uri: http://localhost:9091
          uri: lb://product
          predicates:
            - Path=/product
      globalcors: # 全局跨域处理
        cors-configurations:
          '[/**]':
            allowedMethods: "*"
            allowedHeaders: "*"
            allowedOriginPatterns: "*" # 2.4 以后版本不可以写成 allowedOrigin
            allowCredentials: true

1.6.3、创建启动类

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient //(可省略)
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

}

1.6.4、测试

通过网关访问 user 微服务和 product 微服务

1.7、nacos 实现配置中心

1.7.1、建议

一般来说,项目初期开发只用三个组件:nacos注册中心、gateway网关、openFeign声明式远程调用。

值得注意的是,前期项目开发完成之前,也不要使用 nacos 配置中心,原因如下:

  1. 因为一旦需要改什么配置,还需要打开 nacos 修改,容易分心,建议就先用项目中 application.yml 即可
  2. 引入依赖,但不配置,会报错.

1.7.2、引入 nacos 配置中心依赖

这里以 user 微服务为例,引入 nacos 配置中心依赖.

XML 复制代码
        <!--nacos config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

注意:SpringCloudAlibaba 高版本(例如 springcloud-alibaba 2021.0.1.0)会忽略 bootstrap.yml 文件,因此需要加上以下配置

XML 复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

1.7.3、在 nacos 上创建配置

a)在 nacos 上创建一个命名空间

b)在配置管理中选择刚创建的命名空间 demo1

c)创建一个新的配置文件,接着就可以把 user 微服务 yml 中配置所有信息都放到 nacos 上进行统一管理,随后点击发布

Ps:配置内容不要有注释! 天坑!

d)创建 bootstrap.yml 配置文件,用来拉去 nacos 上的配置文件.

XML 复制代码
# 远端配置中心是谁
spring:
  cloud:
    nacos:
      server-addr: locahost:8890
      config:
        # 使用 nacos 中的哪个 namespace
        namespace: 0e48f075-ad88-4700-a422-d315a81f9ced
        # 使用 nacos 中的哪个组
        group: user
        # 使用 nacos 中的哪个 dataId  1.name+文件后缀 2.文件名+env+后缀
        name: user-prod
        file-extension: yml

Ps:原先的 application.yml 就可以删除了.

相关推荐
武子康19 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
H愚公移山H2 天前
Spring Cloud Alibaba [Gateway]网关。
java·gateway·springcloud
吴冰_hogan3 天前
Ribbon 入门实战指南
后端·spring cloud·ribbon·springcloud
武子康6 天前
Java-01 深入浅出 MyBatis - MyBatis 概念 ORM映射关系 常见ORM 详细发展历史
java·数据库·sql·spring·mybatis·springboot·springcloud
吴冰_hogan7 天前
nacos配置中心入门
java·spring boot·spring·springcloud
菜菜-plus9 天前
分布式,微服务,SpringCloudAlibaba,nacos,gateway,openFeign
java·分布式·微服务·nacos·gateway·springcloud·openfeign
吴冰_hogan10 天前
nacos集群源码解析-cp架构
java·spring boot·spring·架构·服务发现·springcloud
茶馆大橘12 天前
消息队列系列一:RabbitMQ入门讲解
java·分布式·微服务·rabbitmq·springcloud
茶馆大橘15 天前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud