高可用服務注冊中心、服務提供者、服務消費者|微服務配置內容


前言:

高可用服務注冊中心:首先要知道什么是一個高可用的服務注冊中心,基於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。。。。不知所以然


免責聲明!

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



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