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 等組件下面對這些組件

  • openfeign 是用來為微服務架構下服務之間的調用提供了解決方案,可以理解為被封裝的請求模式。
  • zipkin 是用來做鏈路跟蹤的工具,是一個開放源代碼分布式的跟蹤系統,每個服務向zipkin報告計時數據,zipkin會根據調用關系通過Zipkin UI生成依賴關系圖(以后的博客里會將)
  • actuator 是用來做應用的健康檢查,Spring Boot Actuator可以幫助你監控和管理Spring Boot應用,比如健康檢查、審計、統計和HTTP追蹤等。所有的這些特性可以通過JMX或者HTTP endpoints來獲得。
  • sentinel 是面向分布式服務架構的高可用流量防護組件,主要以流量為切入點,從限流、流量整形、熔斷降級、系統負載保護、熱點防護等多個維度來幫助開發者保障微服務的穩定性。
  • websocket 全雙工通訊協議,可簡單理解為服務端可以主動向客戶端發送請求

實現多環境打包需要配置多個*.yml 配置文件,配置文件

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

application-dev內容

#======================================#
#========== 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 配置信息說明

 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 源碼 如下**

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 項目也可以運行但是會打印出一句警告的話,大概意思是說驅動版本需要升級
所以在出現這句話的時候大家不要謊。

另外需要注意的是在為應用起名字的時候盡量不要用_ 和特殊字符,可以用-,否則在啟動的時候會打印出警告

針對微服務,我們在新增微服務組件的時候盡量遵循三個步驟
1 pom 文件引入依賴
2 yml 寫配置
3 項目加注解

用戶微服務引入Nacos 步驟

  • 引入依賴
   <!--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,需要哪個環境就打哪個環境的包

下一節會為大家講解服務和服務之間的調用,希望能夠幫助大家搭建一個簡單的微服務系統。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM