前言:
高可用服務注冊中心:首先要知道什么是一個高可用的服務注冊中心,基於spring boot建成的服務注冊中心是一個單節點的服務注冊中心,這樣一旦發生了故障,那么整個服務就會癱瘓,所以我們需要一個高可用的服務注冊中心,那么在Eureka中,我們通過集群來解決這個問題。啥叫集群呢?就是多配幾個,一個服務注冊中心掛了,還有另一個。
服務提供者:被其他微服務調用的微服務
服務消費者:調用的其他微服務的微服務
另外要注意jdk的版本需要1.8或1.8以上,否則無法執行。
1 但這里我遇到了一個奇怪的問題:本來我的jdk版本是1.6的,我需要更換。但是怎么配置環境 2 變量,在命令行輸入java -version仍然是1.6,這里並不是配錯了,而是在安裝JDK1.6時, 3 自動將java.exe、javaw.exe、javaws.exe三個可執行文件復制到了C:\Windows 4 \System32目錄,我們所執行的java命令正是這個java.exe所以我們先需要將這3個可執行 5 文件刪除,然后再配置jdk1.8
另附java環境搭建方法
https://jingyan.baidu.com/article/c85b7a6414f2ee003bac95d5.html
那開始項目吧!
1、首先創建一個高可用的服務注冊中心吧,取名為erueka-server

2、pom.xml內容配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 6 <groupId>wfw.wlovet</groupId> 7 <artifactId>eureka-server</artifactId> 8 <version>0.0.1-SNAPSHOT</version> 9 <packaging>jar</packaging> 10 11 <name>eureka-server</name> 12 <description>Demo project for Spring Boot</description> 13 14 <parent> 15 <groupId>org.springframework.boot</groupId> 16 <artifactId>spring-boot-starter-parent</artifactId> 17 <version>1.5.6.RELEASE</version> 18 <relativePath/> <!-- lookup parent from repository --> 19 </parent> 20 21 <properties> 22 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 23 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 24 <java.version>1.8</java.version> 25 </properties> 26 27 <dependencies> 28 <dependency> 29 <groupId>org.springframework.boot</groupId> 30 <artifactId>spring-boot-starter</artifactId> 31 </dependency> 32 33 <dependency> 34 <groupId>org.springframework.cloud</groupId> 35 <artifactId>spring-cloud-starter-eureka-server</artifactId> 36 </dependency> 37 38 <dependency> 39 <groupId>org.springframework.boot</groupId> 40 <artifactId>spring-boot-starter-test</artifactId> 41 <scope>test</scope> 42 </dependency> 43 </dependencies> 44 45 <dependencyManagement> 46 <dependencies> 47 <dependency> 48 <groupId>org.springframework.cloud</groupId> 49 <artifactId>spring-cloud-dependencies</artifactId> 50 <version>Dalston.SR3</version> 51 <type>pom</type> 52 <scope>import</scope> 53 </dependency> 54 </dependencies> 55 </dependencyManagement> 56 <build> 57 <plugins> 58 <plugin> 59 <groupId>org.springframework.boot</groupId> 60 <artifactId>spring-boot-maven-plugin</artifactId> 61 </plugin> 62 </plugins> 63 </build> 64 </project>
3、兩個配置文件之peer1的內容
1 server.port=1111 2 eureka.instance.hostname=peer1 3 eureka.client.register-with-eureka=false 4 eureka.client.fetch-registry=false 5 eureka.client.service-url.defaultZone=http://peer2:1112/eureka/
4、兩個配置文件之peer2的內容
1 server.port=1112 2 eureka.instance.hostname=peer2 3 eureka.client.register-with-eureka=false 4 eureka.client.fetch-registry=false 5 eureka.client.service-url.defaultZone=http://peer1:1111/eureka/
關於這兩個配置文件需要知道如下幾點:
1.在peer1的配置文件中,讓它的service-url指向peer2,在peer2的配置文件中讓它的service-url指向peer1
2.為了讓peer1和peer2能夠被正確的訪問到,我們需要在C:\Windows\System32\drivers\etc目錄下的hosts文件總添加兩行配置,如下:
127.0.0.1 peer1
127.0.0.1 peer2
3.由於peer1和peer2互相指向對方,實際上我們構建了一個雙節點的服務注冊中心集群


5、java程序啟動代碼
1 import org.springframework.boot.SpringApplication; 2 import org.springframework.boot.autoconfigure.SpringBootApplication; 3 import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; 4 5 @EnableEurekaServer 6 @SpringBootApplication 7 public class Application { 8 public static void main(String[] args) { 9 SpringApplication.run(Application.class, args); 10 } 11 }
最后包的結構:

6、將該maven項目打包成可執行的.jar文件
選中pom.xml文件,右擊鼠標點擊run,選擇Maven install,等待即可

7、生成jar文件之后,我們在命令行通過java命令來啟動項目,在啟動的時候我們可以設置采用不同的配置文件來啟動項目,命令如下:
1 java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1 2 java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

8、在瀏覽器中進行驗證
輸入localhost:1111與localhost:1112


9、接下來創建一個服務提供者,取名為server-provider

10、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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>wfw.wlovet</groupId> <artifactId>provider</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>provider</name> <description>Demo project for Spring Boot</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> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR3</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> </project>
11、application.properties的配置為
spring.application.name=hello-service eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/
12、控制類HelloController代碼為
package com.wlovet.controller; import java.util.List; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { private final Logger logger = Logger.getLogger(getClass()); @Autowired private DiscoveryClient client; @RequestMapping(value = "/hello", method = RequestMethod.GET) public String index() { List<ServiceInstance> instances = client.getInstances("hello-service"); for (int i = 0; i < instances.size(); i++) { logger.info("/hello,host:" + instances.get(i).getHost() + ",service_id:" + instances.get(i).getServiceId()); } return "Hello World"; } }
13、啟動類ServerApplication代碼為
package com.wlovet; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient//此處注解必須 public class ServerApplication { public static void main(String[] args) { SpringApplication.run(ServerApplication.class, args); } }
14、打包成可執行的jar文件|打包教程請看上文

最后包的結構:

15、在命令行中輸入
java -jar provider-0.0.1-SNAPSHOT.jar --server.port=8081
java -jar provider-0.0.1-SNAPSHOT.jar --server.port=8082
16、最后創建一個服務消費者,取名為ribbon-consumer

17、pom.xml配置為,此處增加了spring-cloud-starter-ribbon
<?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> <groupId>wfw.wlovet</groupId> <artifactId>ribbon-consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>ribbon-consumer</name> <description>Demo project for Spring Boot</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.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.xbean</groupId> <artifactId>xbean-spring</artifactId> <version>4.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId> spring-boot-starter-data-elasticsearch </artifactId> </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> </project>
18、application.propertes配置內容為(作為測試我只打開一個服務注冊中心)
spring.application.name=ribbon-consumer server.port=9000 eureka.client.service-url.defaultZone=http\://peer1\:1111/eureka
19、啟動類ConsumerApplication的內容為
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } //LoadBalanced負責加載負載均衡 @LoadBalanced @Bean RestTemplate restTemplate() { //RestTemplate為負載均衡 return new RestTemplate(); } }
20、控制轉發類ConsumerController的內容為
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class ConsumerController { @Autowired RestTemplate restTemplate; @RequestMapping(value = "/ribbon-consumer", method = RequestMethod.GET) public String helloController() { return restTemplate.getForEntity("http://hello-service/hello", String.class).getBody(); } }
最后包的結構:

21、測試項目
啟動服務注冊中心---->啟動服務提供項目---->啟動服務消費項目---->在瀏覽器內輸入localhost:9000/ribbon-consumer
結果為:


至此,簡單的微服務就搭好了!
em。。。。但我在運行ribbon-consumer的時候又遇到一個奇怪的問題,感覺我好像說過相同的話。。。

啊?有點莫名奇妙-.-!,然后自己手動導包解決的,em。。。。不知所以然
