SpringCloud第一篇-Eureka:服务的注册与发现

来源:互联网 发布:美国滑板鞋牌子 知乎 编辑:程序博客网 时间:2024/05/16 08:19

spring cloud概述

中国社区:https://springcloud.cc/

  • 服务发现——Netflix Eureka
  • 客服端负载均衡——Netflix Ribbon
  • 客服端方便REST服务调用组件——Netflix Feign(包含了Ribbon)
  • 断路器——Netflix Hystrix
  • 服务网关——Netflix Zuul
  • 分布式配置——Spring Cloud Config
  • 断路器监控——Hystrix Dashboard
  • 断路器聚合监控——Hystrix Turbine
  • 消息总线——Spring Cloud Bus
  • 服务链路追踪——Spring Cloud Sleuth-组件zipkin

    Eureka是Spring Cloud Netflix的一个子模块,也是核心模块之一。用于云端服务发现,一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。

服务注册与发现对于微服务系统来说非常重要。有了服务发现与注册,你就不需要整天改服务调用的配置文件了,你只需要使用服务的标识符,就可以访问到服务。他的功能类似于dubbo的注册中心(register)。

  • 服务发现:服务发现是微服务基础架构的关键原则之一。试图着手配置每个客户端或某种格式的约定可以说是非常困难的和非常脆弱的。Eureka是Netflix服务发现的一种服务和客户端。这种服务是可以被高可用性配置的和部署,并且在注册的服务当中,每个服务的状态可以互相复制给彼此。

  • 服务注册:当一个客户端注册到Eureka,它提供关于自己的元数据(诸如主机和端口,健康指标URL,首页等)Eureka通过一个服务从各个实例接收心跳信息。如果心跳接收失败超过配置的时间,实例将会正常从注册里面移除

这里写图片描述

工具及依赖版本

  1. IDE使用IDEA2017版

    • IDEA 破解方法:
      填入下面的license server:

        http://intellij.mandroid.cn/
        http://idea.imsxm.com/
        http://idea.iteblog.com/key.php

    • IDEA 在同一目录创建多个项目
  2. maven3.0

  3. Spring Boot 1.5.x ,Spring Cloud版本为Dalston.RELEASE

Eureka

Spring Cloud Netflix的Eureka ,eureka是一个服务注册和发现模块。
2个工程:

  • eureka-serve工程作为服务注册中心,即Eureka Serve
  • service-hello另一个作为Eureka Client

application.yml

eureka-server的application.yml配置如下
service-hello的配置也和它一样只是artifactId不同

<?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.bamboo</groupId>    <artifactId>eureka-server</artifactId>    <version>1.0-SNAPSHOT</version>    <packaging>jar</packaging>    <repositories><!-- 镜像 -->        <repository>            <id>spring-milestones</id>            <name>Spring Milestones</name>            <url>https://repo.spring.io/milestone</url>            <snapshots>                <enabled>false</enabled>            </snapshots>        </repository>    </repositories>    <parent><!-- spring-boot -->        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.5.2.RELEASE</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <dependencyManagement><!-- spring-cloud 依赖 -->        <dependencies>            <dependency>                <groupId>org.springframework.cloud</groupId>                <artifactId>spring-cloud-dependencies</artifactId>                <version>Dalston.RC1</version>                <type>pom</type>                <scope>import</scope>            </dependency>        </dependencies>    </dependencyManagement>    <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>        <!--eureka server -->        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka-server</artifactId>        </dependency>        <!-- spring boot test-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies><!--    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build>--></project>

java代码

eureka-server 的Application.java

package comm.bamboo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;/** * *EurekaServer  注册监控服务:启动 * * Created by bamboo on 2017/10/19. */@SpringBootApplication@EnableEurekaServerpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class,args);    }}

只需要一个注解@EnableEurekaServer

service-hello 的Application.java

package comm.bamboo;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;/** *  * 服务客户端 *  *  service-hello Application */@SpringBootApplication@EnableEurekaClient@RestControllerpublic class Application {    /**     * A main() so we can easily run these routing rules in our IDE     */    public static void main(String... args) throws Exception {        SpringApplication.run(Application.class, args);    }    @Value("${server.port}")    String port;    @RequestMapping("/hello")    public String home() {        return "hello from port:" +port;    }}

@EnableEurekaClient是不够的,还需要在配置文件中注明自己的服务注册中心的地址

yml配置

eureka-server的application.yml

server:  port: 8761eureka:  instance:    hostname: localhost  client:    register-with-eureka: false    fetch-registry: false    service-url:     defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

通过eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server.否则默认认为其为客户端

service-hello的application.yml

eureka:  client:    serviceUrl:      defaultZone: http://localhost:8761/eureka/server:  port: 8762spring:  application:    name: service-hello

需要指明spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name

启动工程

分别启动eureka-server启动注册服务和service-hello客户端

打开http://localhost:8761 ,即eureka server 的注册服务网址:
这里写图片描述
可以看到这一行已经显示出来了服务名称(SERVICE-HELLO)和服务的状态(UP (1) - DESKTOP-180I6SH:service-hello:8762)

SERVICE-HELLO   n/a (1) (1) UP (1) - DESKTOP-180I6SH:service-hello:8762

你会发现一个服务已经注册在服务中了,服务名为SERVICE-HELLO ,端口为7862

这时打开 http://localhost:8762/hello ,你会在浏览器上看到 :

hello from port:8762

保护模式

当我们关闭客户端service-hello的运行,打开注册服务的管理页面
会看到如下红字和红圈部分
这里写图片描述
发现我们把客户端关了但是服务监控上依然显示为UP运行状态,这显然是不合理的。同时会出现红字部分

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

这段提示,则说明Eureka已经进入了保护模式。
保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。
详见:https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication

如何解决Eureka Server不踢出已关停的节点的问题

(1) Eureka Server端:配置关闭自我保护,并按需配置Eureka Server清理无效节点的时间间隔。

server:  port: 8761eureka:  instance:    hostname: localhost  client:    register-with-eureka: false    fetch-registry: false    service-url:     defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/#新增的配置部分  server:       enable-self-preservation: false  # 设为false,关闭自我保护       eviction-interval-timer-in-ms: 4000  # 清理间隔(单位毫秒,默认是60*1000)

(2) Eureka Client端:配置开启健康检查,并按需配置续约更新时间和到期时间。

server:  port: 8762spring:  application:    name: service-helloeureka:  client:    serviceUrl:      defaultZone: http://localhost:8761/eureka/  #新增的配置部分  healthcheck:        enabled: true # 开启健康检查(需要spring-boot-starter-actuator依赖)  instance:      lease-expiration-duration-in-seconds: 30  # 续约更新时间间隔(默认30秒)      lease-renewal-interval-in-seconds: 10 # 续约到期时间(默认90秒)

客户端的pom需要加入如下依赖

         <!--暴露各种指标-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>

重新启动注册服务和客户端,你会发现监控页面出现如下红色字,但是过几分钟刷新后会看到客户端的状态已经不再应用列表中了,说明已经起作用了

THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.

关闭保护模式,在网络或其他问题的情况下对实例没有有效的保护
这里写图片描述

注意:
更改Eureka更新频率将打破服务器的自我保护功能,生产环境下不建议自定义这些配置。
详见:https://github.com/spring-cloud/spring-cloud-netflix/issues/373

Eureka注册中心加入权限

注册中心在公网中当然不想让其他人使用,那么可以配置账号密码防止别人轻易使用的问题。

  1. 加入注册中心需要引入jar,eureka-server在pom.xml加入
<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-security</artifactId></dependency>
  1. 配置文件新建一个bootstrap.yml文件
security:    basic:      enabled: true    user:      name: admin      password: 123

详细文档参考:Eureka Server 的身份认证

参考文档

注册中心集群搭建

阅读全文
0 0
原创粉丝点击