1. 程式人生 > >微服務學習——EuerkaServer搭建

微服務學習——EuerkaServer搭建

現在微服務架構越來越普及,目前接觸到主要有dubbo和springcloud

在springcloud中使用euerkaserver作為服務的註冊和發現的中心

簡單搭建EuerkaServer

1 在eclipse新建一個maven專案,在pom.xml檔案中新增相關依賴

		<!--   新增eureka-server    -->
		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <!-- 新增springboot -->
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
<parent>
		<!-- Your own application should inherit from spring-boot-starter-parent -->
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.4.RELEASE</version>
	</parent>

完整的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>
	<parent>
		<!-- Your own application should inherit from spring-boot-starter-parent -->
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.4.RELEASE</version>
	</parent>
	<artifactId>EuerkaServer</artifactId>
	<groupId>com.wxf.SpringCloud</groupId>
	<name>Spring Boot Actuator Sample</name>
	<description>Spring Boot Actuator Sample</description>
	<version>0.0.1-SNAPSHOT</version>
	<url>http://projects.spring.io/spring-boot/</url>
	<organization>
		<name>Pivotal Software, Inc.</name>
		<url>http://www.spring.io</url>
	</organization>
  <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.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</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-security</artifactId>
		</dependency>
		-->
	</dependencies>
	
	<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>Dalston.SR1</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>

2 新增啟動類
在啟動類加入註解@EnableEurekaServer


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

@EnableEurekaServer
@SpringBootApplication
public class Application {
		public static void main(String[] args) {
			  SpringApplication.run(Application.class, args);
			}
}

3 修改application.properties內容

spring.application.name=com.wxf.SpringCloud.EuerkaServer.actuator.Application
server.port=1111

#強制不註冊到註冊伺服器
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

#註冊中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

#驅逐下線的服務,間隔,5秒,預設是60,建議開發和測試環境配置
#org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean.evictionIntervalTimerInMs
eureka.server.evictionIntervalTimerInMs=5000

4 登陸管理頁面
在這裡插入圖片描述

搭建生產者

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>
	<artifactId>SpringCloud.Client</artifactId>
	<groupId>com.wxf.SpringCloud</groupId>
	<name>Spring Boot Actuator Sample</name>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.4.RELEASE</version>
	</parent>
	
  <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>
	<dependencies>
		<dependency>  
    		<groupId>org.springframework.cloud</groupId>  
   			 <artifactId>spring-cloud-starter-eureka</artifactId>  
		</dependency>  
		<!--埠監控依賴包-->
<!--		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	</dependencies>
	
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>Dalston.SR1</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>

啟動類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@SpringBootApplication
public class Application {
		public static void main(String[] args) {
			  SpringApplication.run(Application.class, args);
			}
}

application.properties

spring.application.name=Application-Provider
server.port=8181
#註冊中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
management.endpoints.enabled-by-default=false

接下來我們進入euerka管理頁面
在這裡插入圖片描述

搭建消費者

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>
	<artifactId>SpringCloud.Client</artifactId>
	<groupId>com.wxf.SpringCloud</groupId>
	<name>Spring Boot Actuator Sample</name>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.4.RELEASE</version>
	</parent>
	
  <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>
	<dependencies>
		<dependency>  
    		<groupId>org.springframework.cloud</groupId>  
   			 <artifactId>spring-cloud-starter-eureka</artifactId>  
		</dependency>  
<!--		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--服務呼叫-->
		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
	</dependencies>
	
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>Dalston.SR1</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>

啟動類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class Application {
		public static void main(String[] args) {
			  SpringApplication.run(Application.class, args);
			}
}

控制層
controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class controller {
	
	@Autowired
	Service serviceAFeignClient;

	@RequestMapping(value = "/*",method = RequestMethod.GET)
	@ResponseBody
	public String getHello(){
		String hi = serviceAFeignClient.hi();
		if (hi.isEmpty()){
			hi="遠端呼叫失敗";
		}
		else {
			hi="收到遠端資訊"+hi;
		}
		return hi;		
	}
}

service

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;

@Component
@FeignClient(value = "Application-Provider") //這裡的name對應呼叫服務的spring.applicatoin.name
public interface Service {

	@RequestMapping(value = "/hi")
    String hi();	
}

執行後在euerka註冊中心中可以到到服務
在這裡插入圖片描述

訪問消費者,成功呼叫了提供者暴露的介面

在這裡插入圖片描述


上述內容已經完成了簡單的服務註冊、發現與呼叫。

注意事項:

註解:

  • @EnableEurekaServer
    啟動服務註冊中心
  • @EnableDiscoveryClient
    註冊服務至註冊中心(不單是euerka)
  • @EnableEurekaClient
    註冊服務至註冊中心(只能是euerka)
  • @EnableFeignClients
    需要在啟動項上加上才可以呼叫FeignClient
  • @FeignClient(value = “Application-Provider”)
    呼叫外部服務介面

依賴包:

<!-- euerka註冊中心-->
		<dependency>  
    		<groupId>org.springframework.cloud</groupId>  
   			 <artifactId>spring-cloud-starter-eureka</artifactId>  
		</dependency>  
<!-- 外部服務呼叫-->
			<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>

疑問
服務是如何註冊和發現的?
點選這裡
Euerka Server

  • 註冊:各個微服務啟動時,會通過Eureka Client向Eureka Server進行註冊自己的資訊(例如服務資訊和網路資訊),Eureka Server會儲存該服務的資訊。
  • 呼叫:服務消費者在呼叫服務時,本地Eureka Client沒有的情況下,會到Eureka Server拉取資訊。
  • 維護:
    Cancel 服務下線–Eureka客戶端在程式關閉時向Eureka伺服器傳送取消請求
    Eviction 服務剔除–當Eureka客戶端連續90秒沒有向Eureka伺服器傳送服務續約,即心跳,Eureka伺服器會將該服務例項從服務註冊列表刪除,即服務剔除。
    renew 服務續約–Eureka Client會每隔30秒傳送一次心跳來續約。 通過續約來告知Eureka Server該Eureka客戶仍然存在,沒有出現問題。

服務資訊如何同步?
為保證服務的高可用,一般會部署多個EuerkaServer,防止其中某個註冊中心出現宕機影響服務的呼叫。
每個Eureka Server同時也是Eureka Client,多個Eureka Server之間通過P2P複製的方式完成服務登錄檔的同步。同步時,被同步資訊不會同步出去。也就是說有3個Eureka Server,Server1有新的服務資訊時,同步到Server2後,Server2和Server3同步時,Server2不會把從Server1那裡同步到的資訊同步給Server3,只能由Server1自己同步給Server3。