微服務(二)-Nacos注冊中心、SpringGateway網關、前后端分離


1 Nacos注冊中心

1.1 什么是Nacos?

  Nacos是Spring Cloud Alibaba提供的一個軟件,Nacos可以負責對當前微服務項目進行注冊和管理,也就是"注冊中心"。

  Nacos是一個開發好的軟件,不需要我們進行單獨的配置,我們只需要學習如何安裝 \ 啟動 \ 使用它就可以了。

  要想安裝並順利啟動Nacos,必須配置java的環境變量。

1.2 java環境變量配置

windows操作系統環境變量配置過程如下:

(1)在"計算機\此電腦\我的電腦"圖標上點擊右鍵,選擇“屬性”,在出來的頁面選擇“高級系統設置”

(2)點擊環境變量

(3)檢查是不是有JAVA_HOME的配置,並且配置的路徑確實有jdk的文件內容,如果沒有JAVA_HOME,點擊新建並按要求配置即可。

  變量名:JAVA_HOME 【全部大寫】

  變量值:jdk安裝路徑(我的安裝路徑:D:\Software_Development\JDK)

選中的jdk安裝路徑中應包含如下內容:

  上面就配置好了java的開發環境,接下來就可以運行nacos了。

1.3 安裝啟動Nacos

  安裝非常簡單,就是將壓縮包解壓,點開解壓后nacos文件夾下的bin文件夾包含如下內容:

  其中,startup.cmd這個是Windows系統啟動nacos的命令、shutdown.cmd這個是Windows系統停止nacos的命令,注意logs、work文件夾是之后生成的,最初解壓時文件夾中並沒有這兩個文件夾。

注意:.sh結尾的一套是linux系統使用的。

  要啟動nacos不能直接雙擊,需要使用dos命令來啟動:Win+R 輸入cmd, 進入dos操作窗口

  • 1.根據當前nacos文件夾所在位置切換盤符,格式:盤名:

  • 2.然后進入nacos解壓文件夾所在的bin目錄

  • 3.在bin路徑下,輸入啟動命令:startup.cmd -m standalone,其中,standalone代表着單機模式運行,非集群模式。

  啟動之后訪問:http://localhost:8848/nacos,出現如下頁面,進行登錄,用戶名和密碼都是:nacos

  到此為止,nacos的安裝和啟動就完成了。

  注意:第一次登錄時需要輸入用戶名和密碼(均為nacos),之后登錄就不再需要輸入用戶名和密碼了,直接進入nacos登錄成功首頁。登錄成功首頁如下:

1.4 使用IDEA啟動Nacos

  我們之前啟動Nacos的方式過於復雜,每次啟動都要編寫啟動代碼,一不小心就寫錯,導致啟動失敗。

IDEA提供了方法幫助我們簡單的啟動nacos,步驟如下:

  (1)選擇Edit Configurations...,點擊“+”,找到Shell Script

  (2)設置名字為nacos(其他名字也可以),Script path填寫startup.cmd的路徑,記得寫上standalone.cmd,Script options填寫:-m standalone(嚴格書寫,否則不能正常啟動nacos)

  最好重啟一下Idea確保IDEA使用了最新的環境變量,如果最開始安裝jdk就配置了環境變量JAVA_HOME,現在就不需要重啟IDEA了,可以直接啟動nacos,之后就可以在IDEA中控制nacos的啟動和關閉了。

  • 啟動(啟動前保證nacos只啟動了一次,多次啟動可能報錯,關閉多余啟動。先切換到nacos,再點擊紅色△)

 

  啟動成功頁面如下:

  • 關閉:直接點nacos X即可

1.5 注冊項目到nacos

  今后我們要進行微服務項目的開發,所有當前項目的微服務項目(業務類)都要注冊到nacos。

  我們現在以knows-resource為例,注冊這個項目到nacos,在注冊之前,我們需要很多SpringCloud以及SpringCloud Alibaba的依賴,這些依賴直接提供給大家。

  (1)新建Spring Initializr形式的父項目knows,設置Group、Artifict、Type(Maven POM)、Java Version、選擇SpringBoot最低版本2.4.10,之后什么都不選,完成knows項目的創建。

  父項目knows的pom.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 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.3.12.RELEASE</version>
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
     <groupId>cn.tedu</groupId>
     <artifactId>knows</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <name>knows</name>
     <description>Demo project for Spring Boot</description>
     <packaging>pom</packaging>
     <modules>
         <module>knows-resource</module>
     </modules>
     <properties>
         <java.version>1.8</java.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
         <mybatis.plus.version>3.3.1</mybatis.plus.version>
         <pagehelper.starter.version>1.3.0</pagehelper.starter.version>
         <knows.commons.version>0.0.1-SNAPSHOT</knows.commons.version>
         <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
         <spring-security-jwt.version>1.0.10.RELEASE</spring-security-jwt.version>
     </properties>
     <dependencies>
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
             <optional>true</optional>
         </dependency>
         <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>
     </dependencies>
     <dependencyManagement>
         <dependencies>
             <dependency>
                 <groupId>cn.tedu</groupId>
                 <artifactId>knows-commons</artifactId>
                 <version>${knows.commons.version}</version>
             </dependency>
             <dependency>
                 <groupId>com.baomidou</groupId>
                 <artifactId>mybatis-plus-boot-starter</artifactId>
                 <version>${mybatis.plus.version}</version>
             </dependency>
             <dependency>
                 <groupId>com.baomidou</groupId>
                 <artifactId>mybatis-plus</artifactId>
                 <version>${mybatis.plus.version}</version>
             </dependency>
             <dependency>
                 <groupId>com.baomidou</groupId>
                 <artifactId>mybatis-plus-extension</artifactId>
                 <version>${mybatis.plus.version}</version>
             </dependency>
             <dependency>
                 <groupId>com.baomidou</groupId>
                 <artifactId>mybatis-plus-generator</artifactId>
                 <version>${mybatis.plus.version}</version>
             </dependency>
             <dependency>
                 <groupId>com.github.pagehelper</groupId>
                 <artifactId>pagehelper-spring-boot-starter</artifactId>
                 <version>${pagehelper.starter.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.springframework.cloud</groupId>
                 <artifactId>spring-cloud-dependencies</artifactId>
                 <version>${spring-cloud.version}</version>
                 <scope>import</scope>
                 <type>pom</type>
             </dependency>
             <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
           <dependency
               <groupId>org.springframework.security</groupId
               <artifactId>spring-security-jwt</artifactId
               <version>${spring-security-jwt.version}</version
           </dependency
       </dependencies
   </dependencyManagement
</project>

  (2)創建子項目knows-resource,設置Group、Artifict、Java Version、記得Package加.、選擇SpringBoot最低版本2.4.10,什么都不勾選,對knows-resource項目的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>cn.tedu</groupId>
         <artifactId>knows</artifactId>
         <version>0.0.1-SNAPSHOT</version>
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
     <groupId>cn.tedu</groupId>
     <artifactId>knows-resource</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <name>knows-resource</name>
     <description>Demo project for Spring Boot</description>
 
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
         <!-- springCloudAlibaba 注冊到nacos的依賴 -->
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
         </dependency>
     </dependencies>
 </project>

在knows-resource項目的application-properties添加配置信息:

 # 靜態資源訪問端口
 server.port=8899
 
 # 修改當前項目的靜態資源默認路徑
 spring.resources.static-locations=file:F:/upload
 
 # 微服務必須有一個項目名稱,這個名稱用於注冊到nacos
 spring.application.name=resource-server
 
 # 指定要注冊的nacos的位置, 默認值是localhost:8848,如果就是這個值可以不寫
 spring.cloud.nacos.discovery.server-addr=localhost:8848

最后在SpringBoot啟動類上添加一個注解,完成注冊:

 @SpringBootApplication
 // 下面注解表示當前項目啟動時要注冊到注冊中心!
 @EnableDiscoveryClient
 public class KnowsResourceApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(KnowsResourceApplication.class, args);
    }
 
 }

我們可以將配置過程划分為3個步驟:

  1. pom.xml依賴的配置

  1. application.properties的配置

  1. SpringBoot啟動類的配置

  很多框架和組件都是需要配置這3個位置的,為了大家方便記憶,我們稱之為“配置三板斧”。

  先啟動nacos,再啟動knows-resource項目,就可以在nacos的服務管理的服務列表中看到注冊到nacos注冊中心的微服務項目了。

 

2 Spring Gateway網關

2.1 網關的基本概念

  所謂網關就是負責對外界客戶端請求當前項目時,進行統一管理的組件,網關就是所有請求進入項目前必須經過的關口。

這個關口有如下作用或操作:

  • 身份驗證與權限控制

  • 監視監控與記錄

  • 根據請求路徑動態路由到不同服務器

網關在項目中的位置如圖: 

2.2 創建網關項目

  我們下面就要創建網關項目,最終實現通過瀏覽器訪問網關的路徑,獲得靜態資源服務器的內容。

  SpringCloud提供了實現網關的框架,我們使用的是Spring提供的Spring-Gateway,這個組件性能良好,可以支持高並發、高可用、高性能的互聯網應用程序的要求。

在父項目knows的基礎上新建module子項目:gateway

  (1)選擇Spring Initializr

  (2)修改Group、Artifict、Java Version

  (3)選擇Spring Cloud Routing--->Gateway,boot版本選擇最低版本:2.4.10

  之后選擇默認,點擊Finish,等待加載完畢即可。

父子相認:三板斧

(1)父項目pom.xml添加子module

 <modules>
     <module>knows-resource</module>
     <module>gateway</module>
 </modules>

子項目gateway模塊的pom.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>cn.tedu</groupId>
         <artifactId>knows</artifactId>
         <version>0.0.1-SNAPSHOT</version>
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
     <groupId>cn.tedu</groupId>
     <artifactId>gateway</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <name>gateway</name>
     <description>Demo project for Spring Boot</description>
 
     <dependencies>
         <!--
  下面的依賴就是網關的依賴
             這個網關的依賴自帶了啟動項目的功能,
             注意:這個依賴和spring-boot-starter-web沖突,不能共存
          -->
         <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>
 </project>

(2)配置application.properties

  我們可以使用application.properties文件進行配置工作,但是application的配置比較繁瑣有冗余。因為網關配置比較復雜,所以推薦使用yaml(yml)格式的配置文件。我們在gateway項目的resources文件夾下創建一個名為application.yml的文件,這個文件和application.properties文件一樣,會在SpringBoot啟動時自動解析(yml比properties先解析,內容相同時,properties會覆蓋yml的內容)。

代碼如下:

 server:
  port: 9000
 spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true  #是否與服務注冊與發現組件結合,通過 serviceId 轉發到具體的服務
          lower-case-service-id: true # 忽略大小寫服務器名稱
      routes:  # 開始路由配置
        - id: gateway-resource #路由配置的名稱和具體服務無關
           # resource-server路由的服務器的名稱
           # lb: 是 Load Balance(負載均衡)的縮寫
          uri: lb://resource-server  # 必須和微服務項目名稱一致
           # 路由的路徑設置
           # 表示如果訪問localhost:9000/image/xxxxxxx
           # 那么就相當於訪問resource-server服務中的內容了!
          predicates:
            - Path=/image/**  # 路由特征

補充:

  • yml

  properties文件的冗余(缺點),下面是使用properties配置的數據連接池:

 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 spring.datasource.url=jdbc:mysql://localhost:3306/knows?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
 spring.datasource.username=root
 spring.datasource.password=root

  上面spring.datasource反復出現多次,如果一個配置文件有大量配置,這樣的重復是數不勝數的,我們可以使用另外格式的配置文件:application.yml(全稱yaml)

 spring:
  datasource:
  driver-class-name:com.mysql.cj.jdbc.Driver
  url:jdbc:mysql://localhost:3306/knows?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
  username:root
  password:root
  • 負載均衡:

    如果一個業務有多個服務器提供服務,那么可能會產生每個服務器壓力不均衡的情況,負載均衡技術能夠通過已經編寫好的算法將當前提供服務的服務器的壓力盡量保持在同一個水平。

(3)SpringBoot啟動類添加注解@EnableDiscoveryClient,注冊到nacos

 @SpringBootApplication
 // 網關也要注冊到nacos
 @EnableDiscoveryClient
 public class GatewayApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(GatewayApplication.class, args);
    }
 
 }

2.3 通過路由特征訪問靜態資源

  我們在網關的設置中設置了路由特征:/image/**就是我們設置的路由特征,意思是localhost:9000/image/ * *的請求都會被分配到resource-server服務器

    具體來說 localhost:9000/image/a.jpg

    會訪問的實際路徑為 localhost:8899/image/a.jpg

  但是當前這個路徑沒有資源,會報錯,我們要設置8899/image/為服務器的根目錄,以匹配路由特征,到knows-resource項目中的application.properties文件中添加一個配置即可:

 # 默認情況下 localhost:8899/a.jpg就可以訪問資源路徑下的文件了
 # 添加這個配置后,要求當前項目資源的訪問路徑統一添加/image為前綴
 # 簡單來說,之前localhost:8899/a.jpg的路徑變為了localhost:8899/image/a.jpg
 server.servlet.context-path=/image

  重啟knows-resource項目,輸入路徑測試:http://localhost:8899/image/a.jpg,觀察是否能訪問資源(要保證資源路徑下真的有a.jpg這個圖片),能訪問資源說明路徑設置成功!

  下面再啟動gateway,輸入路徑測試網關是否生效:http://localhost:9000/image/a.jpg。網關注冊成功后nacos列表頁面:

  如果上面的路徑能夠正常訪問圖片的資源的話,一切正常。

Spring-Gateway的依賴和Spring-MVC的依賴是沖突的:

  Spring-Gateway自帶了Netty服務器,Spring-MVC自帶Tomcat服務器

設置網關后,可以訪問多個資源服務期內的資源:

 

3 前后端分離

3.1 什么是前后端分離?

  所謂前后端分離就是java項目中完全不包含任何html \ js \ css \ 資源圖片等靜態資源文件前端項目不包含任何java代碼(包括控制層代碼 \ 業務邏輯層代碼 \ 數據訪問層代碼),現今流行的前端項目是vue+node.js

這么做的好處:

  1. 前后端變化互不影響

  1. 后端可以在網關的幫助下為各種前端類型做出響應

3.2 創建前端項目

  由於我們技術條件限制,仍然使用SpringBoot項目來模擬一個前端項目效果。

創建前端項目knows-client:

(1)選擇Spring Initializr

(2)修改Group、Artifict、Java Version、Package加.

(3)選擇Web,點擊SpringWeb,boot版本選擇最低版本:2.4.10

(4)父子相認:父項目添加子項目的module

 <module>knows-client</module>

子項目knows-client的pom.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>cn.tedu</groupId>
         <artifactId>knows</artifactId>
         <version>0.0.1-SNAPSHOT</version>
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
     <groupId>cn.tedu</groupId>
     <artifactId>knows-client</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <name>knows-client</name>
     <description>Demo project for Spring Boot</description>
 
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
     </dependencies>
 
 </project>

  將portal項目中的所有static文件夾下的靜態資源復制到knows-client項目的static文件夾下,啟動client項目,訪問頁面可以正常顯示表示當前客戶端運行正常。

  以訪問注冊頁面為例:

 

3.3 創建用戶管理模塊knows-sys

  我們當前項目已經有了注冊中心、網關、前端等必要項目的支持,我們最終的目標是將portal項目中的功能從單體項目中抽取出來遷移到用戶管理模塊和問答模塊中。首先我們的小目標是將注冊功能遷移出來,所以先創建用戶管理模塊:knows-sys

(1)在父項目knows上右鍵new Module,選擇Spring Initializr

(2)修改Group、Artifict、Java Version、Package加.

(3)什么都不勾選

(4)點擊Finish完成項目創建

(5)父項目knows中進行父子相認,添加子類module

 <module>knows-sys</module>

(6)子項目依賴較多,可以直接參考使用(直接復制粘貼)

 <?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>cn.tedu</groupId>
         <artifactId>knows</artifactId>
         <version>0.0.1-SNAPSHOT</version>
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
     <groupId>cn.tedu</groupId>
     <artifactId>knows-sys</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <name>knows-sys</name>
     <description>Demo project for Spring Boot</description>
 
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
         </dependency>
         <!--       <dependency>-->
         <!--           <groupId>cn.tedu</groupId>-->
         <!--           <artifactId>knows-commons</artifactId>-->
         <!--       </dependency>-->
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>
         </dependency>
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
         <!-- nacos配置中心的依賴 -->
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
         </dependency>
         <!-- 驗證框架 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-security</artifactId>
         </dependency>
     </dependencies>
 </project>

   刷新Maven!

 


免責聲明!

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



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