Spring Cloud Alibaba 之 user服务

项目技术选型

项目结构

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.laiya</groupId>
    <artifactId>user-center</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>user-center</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--Sporing 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>
        <!--feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>
        <!-- nacos 动态配置-->
        <!--        <dependency>-->
        <!--            <groupId>com.alibaba.cloud</groupId>-->
        <!--            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
        <!--        </dependency>-->

        <!--Redis-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>-->
<!--        </dependency>-->

        <!--Mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--Mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>

        <!--Lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <!--Test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-websocket</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>

        <dependencies>
            <!--整合Spring Cloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--整合Spring Cloud Alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>


    <!--分别设置开发,测试,生产环境-->
    <profiles>
        <!-- 开发环境 -->
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <environment>dev</environment>
            </properties>
        </profile>
        <!-- 测试环境 -->
        <profile>
            <id>test</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <environment>test</environment>
            </properties>
        </profile>
        <!-- 生产环境 -->
        <profile>
            <id>pro</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <environment>pro</environment>
            </properties>
        </profile>
    </profiles>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>

                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.16</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>

        </plugins>
        <!-- 打包后文件名称:项目名-环境-版本 -->
        <finalName>${project.artifactId}-${environment}-${project.version}</finalName>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <!-- 开启过滤替换功能-->
                <filtering>true</filtering>
                <includes>
                    <!-- 项目打包完成的包中只包含当前环境文件 -->
                    <include>application.yml</include>
                    <include>application-${environment}.yml</include>
                    <include>bootstrap.yml</include>
                    <include>mybatis/*/*.xml</include>
                    <include>templates/*.html</include>
                    <include>static/</include>
                </includes>
            </resource>
        </resources>
    </build>

</project>

pom 里配置了多环境打包,openfeign,zipkin,actuator,sentinel,websocket,lombok 等组件下面对这些组件html

  • openfeign 是用来为微服务架构下服务之间的调用提供了解决方案,能够理解为被封装的请求模式。
  • zipkin 是用来作链路跟踪的工具,是一个开放源代码分布式的跟踪系统,每一个服务向zipkin报告计时数据,zipkin会根据调用关系经过Zipkin UI生成依赖关系图(之后的博客里会将)
  • actuator 是用来作应用的健康检查,Spring Boot Actuator能够帮助你监控和管理Spring Boot应用,好比健康检查、审计、统计和HTTP追踪等。全部的这些特性能够经过JMX或者HTTP endpoints来得到。
  • sentinel 是面向分布式服务架构的高可用流量防御组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防御等多个维度来帮助开发者保障微服务的稳定性。
  • websocket 全双工通信协议,可简单理解为服务端能够主动向客户端发送请求

实现多环境打包须要配置多个*.yml 配置文件,配置文件java

  • application.yml 内容
spring:
  profiles:
    active: "@environment@"

application-dev内容mysql

#======================================#
#========== Server settings ==========#
#======================================#
server:
  port: 8086
  #  servlet:
  #    context-path: /user-center
  tomcat:
    uri-encoding: UTF-8





spring:
  #server name
  application:
    name: user-center
  #======================================#
  #========== Database settings ==========#
  #======================================#
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: 
    password: xxxxx
    url: jxxxxx


    #======================================#
    #========== Nacos ==========#
    #======================================#
  cloud:
    nacos:
      discovery:
        # nacos server address
        server-addr: xxxx

  thymeleaf:
    prefix: classpath:/templates/
    check-template-location: true
    suffix: .html
    encoding: utf-8
    servlet:
      content-type: text/html
    mode: HTML5
    cache: false
  #======================================#
  #========== zipkin ==========#
  #======================================#
  zipkin:
    base-url:xxx
    discovery-client-enabled: false
  sleuth:
    sampler:
      #      抽样率 10%
      probability: 1.0


#======================================#
#========== MyBatis settings ==========#
#======================================#

mybatis:
  mapper-locations: classpath:templates/*/*.xml

  #======================================#
  #========== Redis settings ==========#
  #======================================#
#  redis:
#    enabled: true
#    host: xxx
#    port: 6379
#    ssl: false
#    database: 0
#    password: x'x'x'x
#    jedis:
#      pool:
#        # 最大空闲链接数
#        maxIdle: 3
#        # 最大活动链接数
#        maxActive: 20


feign:
  client:
    config:
      #      想要配置的微服务 名称    全局配置 default
      user-center:
        loggerLevel: full
  #        httpclient  链接池
  httpclient:
    enabled: true
    #    feign 的最大链接数
    max-connections: 200
    #    feign 的单个路径最大链接数
    max-connections-per-route: 50



#======================================#
#========== Config sttings ==========#
#======================================#



#
body:
  controllerMethodList:
    swaggerResources,
    getDocumentation
management:
  endpoints:
    web:
      exposure:
        include: '*'

mysql 配置信息说明react

datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: 
    password: xxxxx
    url: jxxxxx

mysql 版本>= 6.x 须要用 com.mysql.cj.jdbc.Driver
mysql 版本<= 5.x 须要用 com.mysql.jdbc.Driver
** com.mysql.jdbc.Driver 源码 以下**git

public class Driver extends com.mysql.cj.jdbc.Driver {
    public Driver() throws SQLException {
        super();
    }

    static {
        System.err.println("Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. "
                + "The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.");
    }
}

经过源码咱们能够看到 Driver 继承了 com.mysql.cj.jdbc.Driver,若是不加 cj 项目也能够运行可是会打印出一句警告的话,大概意思是说驱动版本须要升级
因此在出现这句话的时候你们不要谎。
github

另外须要注意的是在为应用起名字的时候尽可能不要用_ 和特殊字符,能够用-,不然在启动的时候会打印出警告web

针对微服务,咱们在新增微服务组件的时候尽可能遵循三个步骤
1 pom 文件引入依赖
2 yml 写配置
3 项目加注解redis

用户微服务引入Nacos 步骤spring

  • 引入依赖
<!--Nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
  • yml写配置
#=========================#
    #========== Nacos =========#
    #=========================#
spring:
  cloud:
    nacos:
      discovery:
        server-addr: (nacos 请求地址,格式为 ip[域名]:port; 例如 xxx.com:8848,注意 地址前面不要加http 后者https) 
        # namespace: (Nacos 命名空间的uuid  不是名称)
        # cluster-name: xxx
  • 项目加注解(没有注解,不须要)
    ** 启动当前项目后,成功后会先发现Nacos 控制台服务管理里会有一个user-center 的服务**

    至此 微服务注册到Nacos 便成功了,咱们发现服务注册很简单,只须要简单的两步,加依赖,写配置
    针对不一样环境打包的命令为 mvn install -Ppro/-Pdev/-Ptest,须要哪一个环境就打哪一个环境的包

下一节会为你们讲解服务和服务之间的调用,但愿可以帮助你们搭建一个简单的微服务系统。sql