码迷,mamicode.com
首页 > 其他好文 > 详细

Eureka注册中心(上)

时间:2019-07-20 13:03:51      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:cee   检测   了解   最可靠的   artifact   host   过多   table   微服务   

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:123456@eurekaserver2: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:123456@eurekaserver1:8761/eureka/

 

security.basic.enabled=true

security.user.name=test

security.user.password=123456

打包测试

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

Eureka注册中心(上)

标签:cee   检测   了解   最可靠的   artifact   host   过多   table   微服务   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!