Eureka注册中心(上)

Eureka简介

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。

Eureka组件

Eureka包含两个组件:Eureka Server和Eureka Client。

Eureka Server

Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

Eureka Server本身也是一个服务,默认情况下会自动注册到Eureka注册中心。

如果搭建单机版的Eureka Server注册中心,则需要配置取消Eureka Server的自动注册逻辑。毕竟当前服务注册到当前服务代表的注册中心中是一个说不通的逻辑。

Eureka Server通过RegisterGetRenew等接口提供服务的注册、发现和心跳检测等服务。

Eureka Client

Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。

Eureka Client分为两个角色,分别是:Application Service(Service Provider)和Application Client(Service Consumer)

Application Service

服务提供方,是注册到Eureka Server中的服务。

Application Client

服务消费方,通过Eureka Server发现服务,并消费。

在这里,Application Service和Application Client不是绝对上的定义,因为Provider在提供服务的同时,也可以消费其他Provider提供的服务;Consumer在消费服务的同时,也可以提供对外服务。

Eureka Server架构原理简介

Register(服务注册):把自己的IP和端口注册给Eureka。

Renew(服务续约):发送心跳包,每30秒发送一次。告诉Eureka自己还活着。

Cancel(服务下线):当provider关闭时会向Eureka发送消息,把自己从服务列表中删除。防止consumer调用到不存在的服务。

Get Registry(获取服务注册列表):获取其他服务列表。

Replicate(集群中数据同步):eureka集群中的数据复制与同步。

Make Remote Call(远程调用):完成服务的远程调用。

Eureka Server

Eureka Server既是一个注册中心,同时也是一个服务。那么搭建Eureka Server的方式和以往搭建Dubbo注册中心ZooKeeper的方式必然不同,那么首先搭建一个单机版的Eureka Server注册中心。

搭建单机版Eureka Server

Eureka已经被Spring Cloud继承在其子项目spring-cloud-netflix中,搭建Eureka Server的方式还是非常简单的。只需要通过一个独立的maven工程即可搭建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">
  

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.yucong</groupId>
  <artifactId>eureka-server-single</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <skipTests>true</skipTests>
  </properties>

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

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Finchley.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>

全局配置文件

而Eureka Server本身也是一个服务,同时又是一个注册中心。在Spring Cloud中,启动的微服务会自动的搜索注册中心并注册服务,那么在单机版Eureka Server环境中,当前服务注册到当前服务中,明显是不合适的。所以搭建Eureka Server单机版时,需要提供特殊的全局配置,避免回路注册逻辑。

同理,Eureka Server服务在注册中心中发现服务列表逻辑也是不必要的。毕竟注册中心是一个中立的服务管理平台,如果是单机版Eureka Server环境中,Eureka Server服务再去发现服务列表,明显也是不必要的。也需要通过全局配置,避免回路发现逻辑。


# 设置spring应用命名,可以自定义,非必要。推荐定义
spring:
  application:
    name: eureka-server

# 设置Eureka Server WEB控制台端口,自定义。 必要。
server:
  port: 8761

eureka:
  client:
    # 是否将自己注册到Eureka-Server中,默认的为true。 必要
    register-with-eureka: false
    # 是否从Eureka-Server中获取服务注册信息,默认为true。 必要
    fetch-registry: false

启动类

启动Eureka Server注册中心,和普通的SpringBoot应用的启动没有太大的区别。只需要在启动类上增加@EnableEurekaServer注解,来开启Eureka Server服务即可。

注意:这里不要使用@SpringCloudApplication注解来定义启动类。@SpringCloudApplication注解涉及到hystrix相关内容,在后续课程中有细致讲解


@EnableEurekaServer

@SpringBootApplication

public class EurekaServerApplication {

public static void main(String[] args) {

SpringApplication.run(EurekaServerApplication.class, args);

}

}

访问Eureka Server WEB控制台

通过IP和端口,使用浏览器访问即可查看Eureka Server中的信息。本案例中访问地址为:http://localhost:8761/

搭建集群版Eureka Server

注册中心作为微服务架构中的核心功能,其重要性不言而喻。所以单机版的Eureka Server在可靠性上并不符合现在的互联网开发环境。集群版的Eureka Server才是商业开发中的选择。

Eureka Server注册中心的集群和Dubbo的ZooKeeper注册中心集群在结构上有很大的不同。

ZooKeeper注册中心集群搭建后,集群中各节点呈现主从关系,集群中只有主节点对外提供服务的注册和发现功能,从节点相当于备份节点,只有主节点宕机时,从节点会选举出一个新的主节点,继续提供服务的注册和发现功能。

而Eureka Server注册中心集群中每个节点都是平等的,集群中的所有节点同时对外提供服务的发现和注册等功能。同时集群中每个Eureka Server节点又是一个微服务,也就是说,每个节点都可以在集群中的其他节点上注册当前服务。又因为每个节点都是注册中心,所以节点之间又可以相互注册当前节点中已注册的服务,并发现其他节点中已注册的服务。所以Eureka Server注册中心集群版在搭建过程中有很多的方式,找到一个最合适最可靠的搭建方式才能称为一个称职的程序员。

集群版Eureka Server可以通过Spring Boot多环境配置方式快速搭建。只要创建一个合适的Eureka Server工程,通过多个全局配置即可完成快速搭建。

本案例中单间一个双节点的Eureka Server集群。

Linux版本为: CentOS 6.5

JDK版本为: 1.8

POM依赖

和单机版Eureka Server相同。

全局配置文件

本案例中的两个节点分别会搭建在两个Linux系统中,为这两个Linux系统分别定义域名为eurekaserver1和eurekaserver2。

在集群搭建过程中,全局配置文件的定义非常重要。其中euraka.client.serviceUrl.defaultZone属性是用于配置集群中其他节点的。如果有多个节点,使用逗号‘,‘分隔。

有部分程序员只配置某一个集群节点信息,通过集群节点间的注册通讯实现节点的全面发现。这种配置形式是不推荐的。因为Eureka Server在服务管理上,会根据连带责任来维护服务列表,如果某集群节点宕机,那么通过这个节点注册过来的服务都会连带删除。

eurekaserver1配置


spring.application.name=eureka-server

server.port=8761

# 设置eureka实例名称,建议与配置文件的变量相同,必须和Linux系统域名相同

eureka.instance.hostname=eurekaserver1

# 设置服务注册中心地址,指向另一个注册中心,使用域名作为访问路径

eureka.client.serviceUrl.defaultZone=http://eurekaserver2:8761/eureka/

eurekaserver2配置


spring.application.name=eureka-server

server.port=8761

eureka.instance.hostname=eurekaserver2

eureka.client.serviceUrl.defaultZone=http://eurekaserver1:8761/eureka/

打包工程形成jar文件

使用run -> maven install即可实现打包过程。打包后的jar文件保存在工程中的target目录中。

上传打包后的jar文件到Linux系统

过程略。

设置Linux主机域名

修改/etc/hosts文件,设置主机域名。将主机域名和IP进行绑定。

vi /etc/hosts

新增内容如下:两个Linux系统修改内容相同。


192.168.2.115 eurekaserver1

192.168.2.116 eurekaserver2

使用命令启动Eureka Server

可以在Linux终端中,通过java命令来启动Eureka Server。在启动的时候,可以通过启动参数来设置有效的配置环境。具体命令如下:
java -jar
-Dspring.profiles.active=eurekaserver1 spring-cloud-eureka-server-cluster-1.0.jar

其中-Dspring.profiles.active启动参数,用于定义本次启动的Eureka Server应用的有效全局配置命名,也就是全局配置文件的后缀。SpringBOOT在启动的时候,会根据启动参数来决定读取的有效全局配置文件是哪一个。

Java程序员不必要掌握shell脚本的编写。建议对shell脚本有一定的了解,至少能够修改内部的必要参数值。Shell脚本一般由运维或部署人员开发。也可能有系统工程师开发。

当然,每次通过命令来启动Eureka Server过于麻烦,可以定义一个shell文件来简化操作。具体shell内容如下:


#!/bin/bash

cd `dirname $0`

CUR_SHELL_DIR=`pwd`

CUR_SHELL_NAME=`basename ${BASH_SOURCE}`

JAR_NAME="项目jar包名称"

JAR_PATH=$CUR_SHELL_DIR/$JAR_NAME

#JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m
-XX:PermSize=128m"

JAVA_MEM_OPTS=""

SPRING_PROFILES_ACTIV="-Dspring.profiles.active=配置文件变量名称"

#SPRING_PROFILES_ACTIV=""

LOG_DIR=$CUR_SHELL_DIR/logs

LOG_PATH=$LOG_DIR/${JAR_NAME%..log

echo_help()

{

echo -e "syntax: sh
$CUR_SHELL_NAME start|stop"

}

if [ -z $1 ];then

echo_help

exit 1

fi

if [ ! -d "$LOG_DIR" ];then

mkdir
"$LOG_DIR"

fi

if [ ! -f "$LOG_PATH" ];then

touch
"$LOG_DIR"

fi

if [ "$1" == "start" ];then

# check server

PIDS=`ps --no-heading -C
java -f --width 1000 | grep $JAR_NAME | awk ‘{print $2}‘`

if [ -n
"$PIDS" ]; then

echo -e "ERROR:
The $JAR_NAME already started and the PID is ${PIDS}."

exit 1

fi

echo "Starting the
$JAR_NAME..."

# start

nohup java
$JAVA_MEM_OPTS -jar $SPRING_PROFILES_ACTIV $JAR_PATH >> $LOG_PATH
2>&1 &

COUNT=0

while [ $COUNT -lt 1 ];
do

sleep 1

COUNT=`ps  --no-heading -C java -f --width 1000 | grep
"$JAR_NAME" | awk ‘{print $2}‘ | wc -l`

if [ $COUNT -gt 0 ];
then

break

fi

done

PIDS=`ps  --no-heading -C java -f --width 1000 | grep
"$JAR_NAME" | awk ‘{print $2}‘`

echo "${JAR_NAME}
Started and the PID is ${PIDS}."

echo "You can check
the log file in ${LOG_PATH} for details."

elif [ "$1" == "stop" ];then

PIDS=`ps --no-heading -C
java -f --width 1000 | grep $JAR_NAME | awk ‘{print $2}‘`

if [ -z
"$PIDS" ]; then

echo "ERROR:The
$JAR_NAME does not started!"

exit 1

fi

echo -e "Stopping
the $JAR_NAME..."

for PID in $PIDS; do

kill $PID >
/dev/null 2>&1

done

COUNT=0

while [ $COUNT -lt 1 ];
do

sleep 1

COUNT=1

for PID in $PIDS ;
do

PID_EXIST=`ps
--no-heading -p $PID`

if [ -n
"$PID_EXIST" ]; then

COUNT=0

break

fi

done

done

echo -e
"${JAR_NAME} Stopped and the PID is ${PIDS}."

else

echo_help

exit 1

fi

设置好shell启动脚本后,需要提供可执行权限:shell脚本文件名自己修改。

chmod 755 xxx.sh

脚本使用方式为:

启动Eureka Server  - ./xxx.sh start

关闭Eureka Server  - ./xxx.sh stop

Eureka
Server安全认证

Eureka Server作为Spring Cloud中的服务注册中心,如果可以任意访问的话,那么其安全性太低。所以Spring Cloud中也有为Eureka Server提供安全认证的方式。可以使用spring-boot-starter-security组件来为Eureka Server增加安全认证。

POM依赖


<!--
spring boot security安全认证启动器 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-security</artifactId>

</dependency>

修改全局配置文件

在全局配置文件中,开启基于http basic的安全认证。

eurekaserver1配置


spring.application.name=eureka-server

server.port=8761

eureka.instance.hostname=eurekaserver1

# 使用http basic安全认证语法,在集群通信中增加认证信息。

eureka.client.serviceUrl.defaultZone=http://test:[email protected]:8761/eureka/

# 开启基于http basic的安全认证

security.basic.enabled=true

# 设置安全认证用户名

security.user.name=test

# 设置安全认证密码

security.user.password=123456

eurekaserver2配置


spring.application.name=eureka-server

server.port=8761

eureka.instance.hostname=eurekaserver2

eureka.client.serviceUrl.defaultZone=http://test:[email protected]:8761/eureka/

security.basic.enabled=true

security.user.name=test

security.user.password=123456

打包测试

上述内容修改完毕后,需要重新打包工程并部署到Linux中启动测试。具体过程略。

原文地址:https://www.cnblogs.com/yucongblog/p/11217316.html

时间: 2024-09-28 12:15:44

Eureka注册中心(上)的相关文章

【码上微服务】- 环境搭建 - Eureka注册中心

一.前言 本章将讲述基于Spring Cloud的注册中心Eureka的简单工程搭建及Docker部署. 二.环境准备 操作系统:CentOS 7.2 项目管理:MAVEN(推荐使用阿里源中央仓库:http://maven.aliyun.com/nexus/content/repositories/central/) 开发IDE:IDEA 所用语言:JAVA 所用容器:Docker 三. Eureka注册中心项目搭建 JAVA工程创建(这里使用了IDEA) 相关的pom.xml <?xml ve

SpringCloud(一)Eureka注册中心

Eureka简介 Eureka作为注册中心,管理各种服务功能包括服务的注册.发现.熔断.负载.降级等 Eureka注册中心实例 Eureka Server 1.pom文件配置SpringBoot.SpringCloud的依赖: 2.启动类配置 @EnableEurekaServer 注解,表示注册中心: /** * SpringCloud是基于SpringBoot的,这是一个启动类的注解 */ @SpringBootApplication /** * 这是注册中心Eureka的注解 */ @En

springCloud Eureka注册中心原理及配置理解

Eureka 配置流程 原理:     服务提供方启动后将注册到 注册中心,提供IP, 名字,什么服务等信息, 服务调用方作为客户端注册到注册中心后,拉取注册中心的服务列表,在通过负载均衡调用对应的服务提供方. 注册中心可以建立集群,生成多台eureka,注册中心为了监测各个服务的心跳,将在每30S 向所注册的服务发起请求判断 服务是否挂掉,如果挂掉90S后将会将服务从注册中心剔除. 一个服务可以监测多台服务实例,从而可实现均很负载. 配置步骤:  一.加依赖 以下指POM文件 <!--注册中心

这个注册的 IP 网络都不通了,Eureka 注册中心竟然无法踢掉它!

本文导读: 微服务技术架构选型介绍 k8s 容器化部署架构方案 Eureka 注册中心问题场景 问题解决手段及原理剖析 阅读本文建议先了解: 注册中心基本原理 K8s(Kuberneters)基本概念 我们的微服务目前都是在服务器上部署的,也是基于 Docker 来部署的. 运维部门基于 K8s 自研了一套容器云管理平台,平台名称叫做 Ares,我们也开始准备将微服务迁移到这平台上,降低虚拟机或实体机服务器运维成本,提高服务器资源利用效率. Ares:阿瑞斯(战神) 希腊神话中为战争而生的神,奥

Eureka注册中心

一.前言 服务治理是微服务架构体系中,不可或缺的重要的一部分.SpringCloud 中对 Netflix Eureka 进行了再封装,将其作为默认的推荐的服务注册中心.Spring Cloud Eureka 是一个基于 Rest 的服务,提供了基于 Java 的客户端,非常方便快捷的使用. 注册中心的存在,可以很好的隔绝生产者和消费者.当你需要调用某一个服务的时候,你不需要知道服务的具体实现细节,也不需要知道具体的是有多少的服务提供方在工作.你只需要去 Eureka 中去哪去服务列表,查看其中

SpringCloud学习心得—1.2—Eureka注册中心的密码认证、高可用的设置

SpringCloud学习心得—1.2—Eureka注册中心的密码认证.高可用的设置 这是相关代码 链接 Eureka开启密码配置 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> 向properties添加密码与用户名 spr

Spring Cloud第三篇 | 搭建高可用Eureka注册中心

? ?本文是Spring Cloud专栏的第三篇文章,了解前两篇文章内容有助于更好的理解后面文章: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cloud第二篇 | 使用并认识Eureka注册中心 ? 一.Eureka注册中心高可用集群概述 1-1.传统架构 在微服务架构的这种分布式系统中,我们要充分考虑各个微服务组件的高可用性问题,不能有单点故障,由于注册中心Eureka本身也是一个服务,如果它只有一个节点,那么它有可能发生故障,这样我们

Spring Cloud第二篇 | 使用并认识Eureka注册中心

? 本文是Spring Cloud专栏的第二篇文章,了解前一篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 ?? 一.SpringCloud快速开发入门 SpringCloud是构建在SpringBoot基础之上的 1.创键一个服务提供者(springcloud-service-provider) 1-1.创键提供者类 @RestController @RequestMapping("/provider") pub

Spring-cloud微服务实战【三】:eureka注册中心(中)

??回忆一下,在上一篇文章中,我们创建了两个springboot项目,并且在consumer项目中通过restTemplate进行HTTP通信,成功访问到了producer提供的接口,思考一下这样的实现方式有什么问题? ??1.consumer必须知道producer的IP,才能调用对方的HTTP接口,并且在consumer代码中使用硬编码的方式来访问producer的HTTP接口,代码耦合度高,实现方式不优雅.也许有童鞋会说,我们可以在application.properties配置文件进行配