微服務-分散式與集群架構和Spring Eureka介紹
微服務是一種軟體架構風格,受到服務導向架構(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/
可以看到註冊中心管理介面。
以上就是微服務概念以及啟動環境的設定。