Eureka服务发现与注册

1.1 什么是Eureka


想去搜一个比较官方的说法结果WIKI上面都是一串不相关的词条,结果还是官方文档帮了我.

Service Discovery: Eureka Clients
Service Discovery is one of the key tenets of a microservice based architecture. Trying to hand configure each client or some form of convention can be very difficult to do and can be very brittle. Eureka is the Netflix Service Discovery Server and Client. The server can be configured and deployed to be highly available, with each server replicating state about the registered services to the others.

节选翻译最后一句:可以对服务器进行配置和部署,使其具有高可用性,每个服务器都将对已注册服务的状态复制到其他服务器上。

相当于是一个服务的管理者,关于其它更丰富的描述与介绍其它大牛在其博客中也阐述的很清楚了,本篇重点将放在Eureka Server的发现与服务注册部署的笔记.

2.1 准备微服务


2.1.1 准备一个用户服务
使用STS直接创建一个Boot项目: 将下面的几项勾选 这里使用了H2数据库 和Spring JPA作为DAO层

构建项目

创建好的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>cn.splus</groupId>
    <artifactId>microservice-eureka-user</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>microservice-eureka-user</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.7.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>Camden.SR7</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </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>
准备数据库sql文件 以及准备几条数据,在resource目录下创建 schema.sql和data.sql:

这里写图片描述
表
数据

创建application.yml配置文件:

User配置文件

然后创建POJO对象:

POJO

创建DAO接口:

这里写图片描述

创建Controller:

这里写图片描述
自动生成的入口类(如果自己用maven创建项目需要自己按照这个格式加上@SpringBootApplication):
入口类

这里一定要注意包结构 入口类要与其它类所在包同级(在这里踩了个小坑调了一下午):

包结构

详见:Spring Boot 扫描不到Controller

访问localhost:8001/findAll 和 localhost:8001/find/1 出现数据 ,完成
findAll
findOne

2.1.2 创建一个用户服务的消费者服务:
使用STS创建一个新项目,勾选上这三项:

这里写图片描述
生成的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>cn.splus</groupId>
    <artifactId>microservice-eureka-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>microservice-eureka-consumer</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.7.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>Camden.SR7</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</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>
    </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>
创建POJO对象

consumerPOJO

创建controller用RestTemplate请求用户服务的API

consumerController

入口类添加本方法,等价于RestTemplate rt = new RestTemplate:

consumerMain

配置文件中只需要配一个端口号:

consumerApplication

访问http://127.0.0.1:8010/user/1 出现数据说明成功:

这里写图片描述

2.2 编写Eureka Server


2.2.1使用STS创建新项目并勾选这两项:

create

生成后的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>cn.splus</groupId>
    <artifactId>microservice-eureka-user</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>microservice-eureka-user</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.7.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>Camden.SR7</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </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>
添加配置文件application.yml:
//表示是否将自己注册到Eureka Server上,默认是true,因为这个项目本身就是Eureka Server,所以设置为false
eureka.client.registerWithEureka: false
//表示是否从Eureka Server获取注册信息,默认为true,因为现在是一个单点Eureka Server,所以设为false
eureka.client.fetchRegistry: false
//设置地址,查询服务和注册服务都要使用
eureka.client.serviceUrl.defalutZone: http://localhost:8761/eureka/

application

2.2.2将微服务注册到Eureka Server上
将本篇上面准备的两个微服务注册到2.2.1中创建的Eureka Server上
因为之前创建项目已经把相关依赖都勾上了,不需要添加额外依赖
在两个项目中都做如下操作:
a)配置文件中添加一下配置:
//指定注册到Eureka Server上的应用名称
spring.application.name: microservice-eureka-consumer
//表示将自己的ip注册到Eureka Server上
eureka.instance.ip-address: true  

addApplication
b)在入口类加入如下注解:
mainAdd

访问http://localhost:8761看见两个服务 即注册成功:

这里写图片描述

3.1Eureka Server的高可用


Eureka Server可以通过多个实例相互注册的方式实现高可用,它们之间会互相同步信息保持所有节点数据一致.
我们可以在上面例子的基础上构建一个双节点的Eureka Server集群

3.1.1修改application.yml配置文件为下面的形式:

newApplication

可以看到文件通过"---"分为了三个部分,开头部分配置了公共属性,应用名称;然后下面分别为我们的两个节点配置了名称和端口号,还有互相注册到Server中

3.1.2把HOSTS文件加上127.0.0.1 peer1 peer2(Windows在C:\Windows\System32\drivers\etc目录下):

HOSTS

3.1.3右键项目Run As-->Maven Install把项目打包

install

也可以进入项目目录下在地址栏进入cmd 输入命令mvn package 也是同样的效果 打好之后的包会在项目的target目录下:

mvnpackage

出现BUILD SUCCESS表示成功

buildsuccess

3.1.4STS中右键项目-->Run As-->Run Configurations

RUN

3.1.5①右键Java Application New 一个,②选择入口类:

这里写图片描述

3.1.6在Arguments中Program arguments框中输入 --spring.profiles.active=peer1表名要运行的是peer1(peer2同理):

Program arguments

点击运行,把peer1和peer2都用如上方式运行
也可以进入项目target文件在地址栏输入cmd进入命令行
执行java -jar [打好的包名] --spring.profile.active=peer2 运行 (与上面方法等效)

maven run

3.1.7 将服务注册到Eureka Server集群上 修改配置文件,添加注册地址:

这里写图片描述

3.1.8将我们的consumer 与 user服务启动,并访问http://peer1:8761/,http://peer2:8762/

peer1


peer2

可以看到服务都分别注册到了Eureka Server上  它们之间也互相注册以及自己注册到了自己上.

此时我们将peer1关闭

ShutDownPeer1

但是此时可以看到peer2开启了”自我保护模式”(出现了那两行红字),默认情况下如果Eureka Server在90秒没有监测到某个微服务的心跳,就会将其注销,因为它的架构设计是宁愿保留”不健康”的微服务,也不盲目注销”健康”的微服务,所以设计了应对这一网络异常的安全保护措施.所以此时peer1并没有被注销掉.

至此 我们就完成了Eureka Server的HA部署

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值