idea 搭建springcloud+springcloud alibaba项目

版本:

jdk:1.8

springcloud alibaba:2.2.1

springboot:2.2.5

springcloud:Hoxton.SR6

个人总结:

(1)首先是服务注册中心以及配置中心(Nacos)

(2)服务注册

(3)openfeign组件实现服务调用(集成了Ribbon,故负载均衡)

(4)gateway网关(实现了统一调用):路由转发,过滤

(5)sentinel流量哨兵(监控整个微服务,从流量控制,熔断降级,系统负载等多个维度保护服务)

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_后端


1.新建无骨架的maven项目作为父项目

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_java_02


删掉src文件目录并引入依赖:

<!--集成springboot父项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
        <spring.cloud.version>Hoxton.SR6</spring.cloud.version>
    </properties>
    <!--全局引入下载依赖地址,并不会引入依赖-->
    <dependencyManagement>
        <dependencies>
            <!--阿里巴巴下载仓库-->
            <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>
            <!--springcloud下载仓库-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_spring_03


然后新建一个Module:commons,以后主要是放置公共实体类以及公共工具类以及公共依赖,所以不需要启动类,以及test

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_后端_04


SpringCloudAlibaba组件详解 springcloudalibaba完整项目_配置文件_05


然后根据上面的方式在随意建两个module,这里一个user,一个product

然后公共类引入Nacos注册发现依赖 以及 springboot的web依赖,两个新建的module引入commons

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

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_后端_06


SpringCloudAlibaba组件详解 springcloudalibaba完整项目_配置文件_07


然后以用户服务为例(三部曲:引依赖,写配置文件,写启动类):

依赖就是上面引的commons。

创建resource文件夹以及application.properties文件并写入配置

server.port=6666
spring.application.name=clouduser

spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
management.endpoints.web.exposure.include=*

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_配置文件_08


写启动类并运行,product服务同上(如果报错,clean/install一下父工程):

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_负载均衡_09

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_负载均衡_10


成功注册到Nacos服务中心

三:引入openfeign实现服务调用(服务可以互相调用,所以依赖可以加在公共服务里)

以user服务为例

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

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_配置文件_11


入口类加入@EnableFeignClients注解

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_配置文件_12


product服务写个接口:

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_java_13


user服务添加新建个clients包,用来存放服务调用接口

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_java_14


然后写user服务接口调用product服务的接口:

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_后端_15


运行:Error:(3,43) java: 程序包org.springframework.cloud.openfeign不存在(报错的话clean/install一下commons服务)

然后复制一个product服务测试负载均衡(这个方法上篇讲过)

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_java_16


访问:

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_spring_17


刷新:

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_java_18

实现负载均衡

接下来先实现流量卫兵的监控
公共依赖引入依赖:

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

然后配置user,product服务的配置文件

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_配置文件_19

spring.cloud.sentinel.enabled=true
spring.cloud.sentinel.transport.dashboard=localhost:xxxx  //这个xxxx是自己的端口号
spring.cloud.sentinel.transport.port=8719

先看下sentinel,暂时没有对应的服务

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_spring_20


然后运行一下各自的接口,在看sentinel就有了(这里application配置文件没有配置spring.cloud.sentinel.eager=true

(这个就是代表立即加在到sentinel就不需要访问一下对应的接口才能检测到))

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_负载均衡_21


哨兵监控完成

然后就是管理配置文件(统一配置管理中心):

commons引入依赖

<!--(nacos统一配置中心管理依赖)-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

然后nacos新建一个生产命名空间:

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_spring_22


然后去生产环境中配置:

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_后端_23


SpringCloudAlibaba组件详解 springcloudalibaba完整项目_后端_24


SpringCloudAlibaba组件详解 springcloudalibaba完整项目_spring_25


然后修改user服务的properties文件为bootstrap

spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
#这是上面环境下的唯一标识
spring.cloud.nacos.config.namespace=732f14fe-5d92-4d02-a276-340d9398b3d8
#这是分组
spring.cloud.nacos.config.group=CLOUDALI
#这三个合起来就是data id
spring.application.name=clouduser
spring.profiles.active=prod
spring.cloud.nacos.config.file-extension=properties

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_spring_26

运行

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_负载均衡_27


成功

接下来是gateway:

新建一个module(cloud-server)并引入依赖(mvc的web依赖跟gateway依赖冲突,所以gateway依赖自己单独引入):

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--gateway依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</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>

        <!--(nacos统一配置中心管理依赖)-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_配置文件_28


然后新建resoure文件夹,配置文件需要写成yml格式:

server:
  port: 7666
spring:
  application:
    name: gateway
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
      discovery:
        service-name: ${spring.application.name}
    gateway:
      routes:
        - id: user-route  #指定唯一标识
          #          uri: http://localhost:6666/ #指定路由服务的地址
          uri: lb://clouduser   #服务名,实现负载均衡
          predicates:
            - Path=/user/** #指定路由规则

        - id: product-route  #指定唯一标识
          #          uri: http://localhost:6667/ #指定路由服务的地址
          uri: lb://cloudproduct   # lb:服务名,实现负载均衡
          predicates:
            - Path=/product/** #指定路由规则
      discovery:
        locator:
          enabled: true  #开启动态服务名动态获取路由地址

management:
  endpoints:
    web:
      exposure:
        include: "*"   #暴露路由的规则端点  /actuator/gateway/routes

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_负载均衡_29

然后新建启动类:

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_负载均衡_30


启动

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_spring_31


访问:

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_java_32


处理格式异常:

通过gateway访问商品服务:

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_负载均衡_33


刷新:

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_spring_34


负载均衡

通过gateway访问user服务,user服务调用的product服务

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_配置文件_35


刷新:

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_配置文件_36


成功

最后,查看路由规则:

这里配置了路由暴露规则端点:

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_配置文件_37


引入依赖:

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_java_38


重启:访问:http://localhost:7666/actuator/gateway/routes

SpringCloudAlibaba组件详解 springcloudalibaba完整项目_后端_39