SpringCloud | 一、eureka服务注册与发现[Finchley版]

源码请访问:https://github.com/GiraffePeng/spring-cloud-scaffolding

1、介绍

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
在这里插入图片描述
上图是来自eureka的官方架构图,这是基于集群配置的eureka;

  • 处于不同节点的eureka通过Replicate进行数据同步
  • Application Service为服务提供者
  • Application Client为服务消费者
  • Make Remote Call完成一次服务调用

Eureka包含两个组件:Eureka Server和Eureka Client。
调用关系说明:
1.服务提供者在启动时,向注册中心注册自己提供的服务。
2.服务消费者在启动时,向注册中心订阅自己所需的服务。
3.注册中心返回服务提供者地址给消费者。
4.服务消费者从提供者地址中调用消费者。

Eureka Server:提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,包括主机与端口号、服务版本号、通讯协议等。这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka服务端支持集群模式部署,首尾相连形成一个闭环即可,集群中的的不同服务注册中心通过异步模式互相复制各自的状态,这也意味着在给定的时间点每个实例关于所有服务的状态可能存在不一致的现象。

eureka Client:主要处理服务的注册和发现。客户端服务通过注册和参数配置的方式,嵌入在客户端应用程序的代码中。在应用程序启动时,Eureka客户端向服务注册中心注册自身提供的服务,并周期性的发送心跳来更新它的服务租约。同时,他也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期行的刷新服务状态。

2、建立父级pom工程

因为是新起项目,为了项目结构的划分,先建立父级的pom工程。选择的依赖版本如下:

  • Spring Cloud - Finchley.RELEASE
  • Spring Data - Lovelace-RELEASE
  • Spring Cloud Stream - Fishtown.M3
  • Spring Boot - 2.0.3.RELEASE

2.1、创建maven工程

以eclipse为例,建立工程,名称:spring-cloud-scaffolding,版本1.0-SHAPSHOT,组名 com.peng
依赖父级工程 spring-boot-starter-parent(2.0.3.RELEASE)。
在这里插入图片描述

2.2、引入依赖

<?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>me.peng</groupId>
	<artifactId>spring-cloud-scaffolding</artifactId>
	<packaging>pom</packaging>
	<version>1.0-SNAPSHOT</version>
	<modules>
		<module>spring-cloud-eureka-server</module>
	</modules>

	<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>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<!-- jaxb模块引用 - start -->
		<dependency>
			<groupId>javax.xml.bind</groupId>
			<artifactId>jaxb-api</artifactId>
		</dependency>
		<dependency>
			<groupId>com.sun.xml.bind</groupId>
			<artifactId>jaxb-impl</artifactId>
			<version>2.3.0</version>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jaxb</groupId>
			<artifactId>jaxb-runtime</artifactId>
			<version>2.3.0</version>
		</dependency>
		<dependency>
			<groupId>javax.activation</groupId>
			<artifactId>activation</artifactId>
			<version>1.1.1</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.54</version>
		</dependency>
		<!-- Swagger核心包 start -->
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.9.2</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.9.2</version>
		</dependency>
		<!-- Swagger核心包 end -->
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Finchley.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>org.springframework.data</groupId>
				<artifactId>spring-data-releasetrain</artifactId>
				<version>Lovelace-RELEASE</version>
				<scope>import</scope>
				<type>pom</type>
			</dependency>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-stream-dependencies</artifactId>
				<version>Fishtown.M3</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>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<configuration>
					<nonFilteredFileExtensions>
						<nonFilteredFileExtension>cert</nonFilteredFileExtension>
						<nonFilteredFileExtension>jks</nonFilteredFileExtension>
					</nonFilteredFileExtensions>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<repositories>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/libs-milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>

</project>

3、eureka单机版

建立eureka服务,工程名spring-cloud-eureka-server,依赖父级spring-cloud-scaffolding
在这里插入图片描述
基于spring-cloud-scaffolding中pom的配置,在eureka-server的pom中添加如下配置:

<?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">
    <parent>
        <artifactId>spring-cloud-scaffolding</artifactId>
        <groupId>me.peng</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-cloud-eureka-server</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

</project>

在resources文件夹下创建一个配置文件application.yml(对于Spring Cloud项目由于配置项有很多,为了能够使模块感层次感强一点,使用yml格式,当然也可以换成properties格式):

server:
  port: 8865

eureka:
  instance:
    hostname: localhost
  client:
    registry-fetch-interval-seconds: 5
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://localhost:8865/eureka/
  server:
    enable-self-preservation: true
    eviction-interval-timer-in-ms: 5000

spring:
  application:
    name: eurka-server

随后建立一个主程序文件:

package com.peng.eureka.server;

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run( EurekaServerApplication.class, args );
    }
}

对于搭建Spring Cloud的一些基础组件的服务,往往就是三步,加依赖,加配置,加注解开关即可。

启动后,访问页面如下:

4、eureka集群版

Eureka Server在设计的时候就考虑了高可用设计,在Eureka服务治理设计中,所有节点既是服务的提供方,也是服务的消费方,服务注册中心也不例外。
Eureka Server的高可用实际上就是将自己做为服务向其他服务注册中心注册自己,这样就可以形成一组互相注册的服务注册中心,以实现服务清单的互相同步,达到高可用的效果。
Eureka Server的同步遵循着一个非常简单的原则:只要有一条边将节点连接,就可以进行信息传播与同步。可以采用两两注册的方式实现集群中节点完全对等的效果,实现最高可用性集群,任何一台注册中心故障都不会影响服务的注册与发现。

基于以上单机版的配置,做下改造,即可满足集群版的要求。 集群版的理念在于eureka之间相互注册与发现。

在yml中添加集群的配置信息:

#单点模式
server:
  port: 8865

eureka:
  instance:
    hostname: localhost
  client:
    registry-fetch-interval-seconds: 5
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://localhost:8865/eureka/
  server:
    enable-self-preservation: true
    eviction-interval-timer-in-ms: 5000

spring:
  application:
    name: eurka-server

---
## 集群模式
spring:
  application:
    name: eurka-server
  profiles: cluster1

server:
  port: 8861

eureka:
  instance:
    hostname: cluster1
  client:
    registry-fetch-interval-seconds: 5
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://cluster2:8862/eureka/,http://cluster3:8863/eureka/
  server:
    enable-self-preservation: true
    eviction-interval-timer-in-ms: 5000
---
spring:
  application:
    name: eurka-server
  profiles: cluster2

server:
  port: 8862

eureka:
  instance:
    hostname: cluster2
  client:
    registry-fetch-interval-seconds: 5
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://cluster1:8861/eureka/,http://cluster3:8863/eureka/
  server:
    enable-self-preservation: true
    eviction-interval-timer-in-ms: 5000
---
spring:
  application:
    name: eurka-server
  profiles: cluster3

server:
  port: 8863

eureka:
  instance:
    hostname: cluster3
  client:
    registry-fetch-interval-seconds: 5
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://cluster1:8861/eureka/,http://cluster2:8862/eureka/
  server:
    enable-self-preservation: true
    eviction-interval-timer-in-ms: 5000

格外需要注意的有两个配置:

  • eureka.client.registerWithEureka:表示是否将自己注册到eureka server,因为要构建集群环境,需要将自己注册到及群众,所以应该开启。默认为true,可不显式设置。
  • eureka.client.fetchRegistry:表示是否从eureka server获取注册信息,如果是单一节点,不需要同步其他eureka server节点,则可以设置为false,但此处为集群,应该设置为true,默认为true,可不设置。
  • eureka.client.serviceUrl.defaultZone:集群模式下,默认的注册于集群中的其他服务上。

因为要在一台机器上搭建集群环境,所以修改hosts文件,windows下hosts默认地址为:C:\Windows\System32\drivers\etc,调整完保存后即可生效。

127.0.0.1 cluster1
127.0.0.1 cluster2
127.0.0.1 cluster3

集群模式本机启动方式有两种:

4.1、以命令行模式启动

使用maven打成jar包后,使用命令

集群cluster1启动: java -jar spring-cloud-eureka-server-1.0-SNAPSHOT.jar --spring.profiles.active=cluster1
对应服务:http://localhost:8861/eureka/

集群cluster2启动: java -jar spring-cloud-eureka-server-1.0-SNAPSHOT.jar --spring.profiles.active=cluster2
对应服务:http://localhost:8862/eureka/

集群cluster3启动: java -jar spring-cloud-eureka-server-1.0-SNAPSHOT.jar --spring.profiles.active=cluster3
对应服务:http://localhost:8863/eureka/

4.2、以eclipse为例启动(IDEA同样,去调整启动时配置即可)

在启动参数中加入对应的–spring.profiles.active
分别启动三次:–spring.profiles.active=cluster1、–spring.profiles.active=cluster2、–spring.profiles.active=cluster3

集群模式启动后eureka管理界面如下(访问任一节点即可,此处访问cluster3):

可以看到画圈部分,已经将三个节点全部相互注册到eureka下。

5、备注

集群模式下,启动单个节点时,控制台或者日志会打印如下错误:

出现这种情况的原因是,我们的程序已经启动(已经出现红框中此条日志,代表程序已经启动,所以程序本身没有问题。),为什么会出现错误呢?

是因为在集群环境中,每一台服务器启动之后,都要去连接集群中的其他服务器,以便于相互之间通讯传递信息。
但是,集群服务器是按照次序启动的,不管先启动哪一台服务器,其他的服务器都还没有准备就绪,所以会出现找不到要连接的服务器,因此会报错。
等到所有的服务器全部启动,整个集群就可以正常运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值