先簡單介紹一下spring cloud簡介:java
spring cloud 爲開發人員提供了快速構建分佈式系統的一些工具,包括配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、決策競選、分佈式會話等等。它運行環境簡單,能夠在開發人員的電腦上跑。Spring Cloud並無重複製造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,經過Spring Boot風格進行再封裝屏蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分佈式系統開發工具包。
本系列文章的背景:本系列文章是基於本人以前的一個完整的綜合站點管理系統,採用新的spring cloud系統進行微服務化的一個演變過程。原系統是一個模塊化的集成系統,各個模塊最終也是須要彙總到一個系統中來啓動和使用,如今的目標是爲了讓原來的各個模塊成爲獨立一個微服務,各個服務之間下降耦合,獨立開發,獨立啓動,獨立使用,提升系統可用性和更好的可擴展性。spring
在此轉換過程當中,是一個完整的學習到實踐的過程,此過程當中因爲包含完整項目需求實踐,所以和簡單的介紹spring cloud有不少不一樣的地方,由於作開發都知道,一個demo很容易,但要實如今一個完整的項目中,勢必會遇到不少各類奇怪的問題須要去解決和處理,而這纔是咱們要學習和接觸一個新技術到實際投入使用以後一個很大的跨越(在我看來,在瞭解,接觸它,到寫出一個demo並非真正的瞭解這門技術),照貓畫虎,沒有一個完整目標需求,每每不知道這個新技術是否真的能爲咱們解決各類不同的問題和場景,從今天開始,我將把該項目的遷移轉移過程和spring cloud的集合過程作一個完整介紹,該介紹的每個切入點都是spring cloud的一項技術,在此過程當中引入我項目的一些實際需求和解決辦法,不必定是最佳解決方案,但至少是處理問題的一個方案,此博客也是我學習記錄之旅,也寄但願於之後也許在我遺忘以後能有一個心路回憶,方便更快想起一個解決方案和找到更好的解決辦法,這是我寫該系列博客的一個重要緣由。開始咱們的學習之旅吧!apache
建立註冊中心後端
在微服務中,一個比不可少的部分,即是一個公共的註冊中心,這一點和rpc遠程調用能夠說是同樣(關於何爲rpc,後續再說吧,也可先自行搜索學習,和咱們目前內容不大相干)。緩存
使用STS(Spring Tool Suite)新建一個spring starter project服務器
因爲我已經完整創建過了,因此提示重名網絡
因爲做爲註冊中心,咱們只選一個Eureka Server便可 而後直接點擊下一步》完成,便可生成註冊中心的項目,完成pom.xml以下app
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>maven
<groupId>org.rk.cloud</groupId> <artifactId>rk-cloud-centralServer</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>rk-cloud-centralServer</name> <description>rk-cloud-centerServer</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </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>Dalston.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories>
</project>
而後在spring boot application啓動類中添加註解@EnableEurekaServer,代碼以下
package org.rk.cloud.centralserver;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication @EnableEurekaServer public class RkCloudCentralServerApplication {
public static void main(String[] args) { SpringApplication.run(RkCloudCentralServerApplication.class, args); }
}
eureka是一個高可用的組件,它沒有後端緩存,每個實例註冊以後須要向註冊中心發送心跳(所以能夠在內存中完成),在默認狀況下erureka server也是一個eureka client ,必需要指定一個 server。eureka server的配置文件appication.properties,以下
server.port=8761 spring.application.name=centralServer spring.profiles=192.168.0.101 eureka.instance.hostname=192.168.0.101 eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/ eureka.instance.ipAddress=192.168.0.101 eureka.instance.preferIpAddress=true #是否將自身註冊 eureka.client.registerWithEureka=true #若是爲true,啓動時報警 eureka.client.fetchRegistry=false eureka.server.enableSelfPreservation=false
通常學習文件和單機使用都不須要spring.profiles,由於這是在高可用是,註冊中心使用集羣保障高可用須要的,多個註冊中心服務組成註冊中心集羣,這裏配合eureka.instance.ipAddress,eureka.instance.preferIpAddress兩個配置來保證在啓動每個註冊中心服務時將ip做爲集羣元素,相互監聽,不然,您須要改服務器環境變量和spring.profiles一致,同時還須要將自身做爲服務註冊相互監聽eureka.client.registerWithEureka=true
最終效果以下:
此過程問題記錄:
一、因爲自學,網絡上提供的學習方式均爲一個demo,並未提供集羣部署方式,所以後來在多機器部署註冊中心集羣高可用時,經歷須要改服務器hosts和多配置文件支持的彎路,最後才獲得上面的結果,以支持集羣的高可用部署