#微服務

微服務-分散式與集群架構和Spring Eureka介紹

鄭博元 2020/11/16 10:54:26
149

微服務是一種軟體架構風格,受到服務導向架構(Service-oriented Architecture,SOA)所啟發的架構風格。
在過去習慣使用單體式開發模式,也就是把所有的功能都放在同一個應用程式裡面,通常要改動一個地方,需要連帶影響整個服務。

而微服務簡單來講,就是把每一個spring boot 就是一個服務的概念,例如一個 product service,可以拆分成負責數據的服務以及畫面的服務,如下圖。

 

 

有了微服務就有管理微服務的需求,以及這兩個微服務彼此之間通訊的需求,這個服務在spring cloud 裡面是使用 eureka server,通過它把微服務註冊起來,以供將來調用。

 

但在業務邏輯上來說,畫面微服務需要數據微服務,所以就存在一個微服務訪問另外一個微服務的需求,畫面端的微服務透過註冊中心訪問。

 

 

系統如此設計就是一個分布式的概念,原本都在一個spring boot 去執行,現在由兩個或多個以上去執行任務,這樣的好處讓團隊在修改其中之一的服務,另外的服務不會受到影響,實現低耦合的概念。

 

 

原本負責數據的微服務只有一個,現在有兩個spring boot 負責同樣的功能,只是端口不一樣,就形成了集群,這樣原本的負載量就擴大成兩倍,假設其中一個端口壞掉,也有另外一個可以馬上使用,而達成高可用性。

 

SpringCloud 服務註冊中心

首先先使用maven 建立父子項目
建立父項目的pom.xml

<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>idv.po.springcloud</groupId>
  <artifactId>springcloud</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>springcloud</name>
  <description>springcloud</description>
  <packaging>pom</packaging>
 
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
    </parent>
 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>
           
    <dependencies>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>

    </dependencies>
 
    <dependencyManagement>
        <dependencies>
            <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>
 
</project>

 

再來是子項目的pom.xml

 

<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>idv.po.springcloud</groupId>
  <artifactId>springcloud</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>springcloud</name>
  <description>springcloud</description>
  <packaging>pom</packaging>
 
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
    </parent>
 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>
           
    <dependencies>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>4.3.1</version>
      </dependency>
    </dependencies>
 
    <dependencyManagement>
        <dependencies>
            <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>
 
</project>

 

EurekaServerApplication

EurekaServre的啟動類,角色相當於註冊中心,用於註冊各種微服務,
EurekaServre本身就是Springboot 微服務,所以有@SpringBootApplicaiton註解。@EnableEurekaServer則表示這是EurekaServre。

 

package idv.po.springcloud;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
	 public static void main(String[] args) {
	 int port = 8761;
	 System.out.println("Application Start!");
	 new SpringApplicationBuilder(EurekaServerApplication.class).properties("server.port=" + port).run(args);
	 }
}

 

 

 

配置文件,提供 eureka 的相關信息。 hostname: localhost 表示主機名稱。 registerWithEureka:false. 表示是否註冊到服務器。因為它本身就是服務器,所以就無需把自己註冊到服務器了。 fetchRegistry: false. 表示是否獲取服務器的註冊信息,和上面同理,這裡也設置為 false。 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ 自己作為服務器,公佈出來的地址。比如後續某個微服務要把自己註冊到 eureka server, 那麼就要使用這個地址: http://localhost:8761/eureka/ name: eurka​​-server 表示這個微服務本身的名稱是 eureka-server

 

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
 
spring:
  application:
    name: eureka-server

 

啟動EurekaServiceApplication,訪問http://127.0.0.1:8761/
可以看到註冊中心管理介面。

 

 

 

 

 


以上就是微服務概念以及啟動環境的設定。

 

 

 

 

 

 

鄭博元