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通过一个服务从各个实例接收心跳信息。如果心跳接收失败超过配置的时间,实例将会正常从注册里面移除
工具及依赖版本
IDE使用IDEA2017版
IDEA 破解方法:
填入下面的license server:http://intellij.mandroid.cn/
http://idea.imsxm.com/
http://idea.iteblog.com/key.php- IDEA 在同一目录创建多个项目
maven3.0
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注册中心加入权限
注册中心在公网中当然不想让其他人使用,那么可以配置账号密码防止别人轻易使用的问题。
- 加入注册中心需要引入jar,eureka-server在pom.xml加入
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>
- 配置文件新建一个bootstrap.yml文件
security: basic: enabled: true user: name: admin password: 123
详细文档参考:Eureka Server 的身份认证
参考文档
注册中心集群搭建
- SpringCloud第一篇-Eureka:服务的注册与发现
- springcloud(第一篇)springcloud eureka 服务注册与发现
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 史上最简单的SpringCloud教程 | 第一篇: 服务的注册与发现(Eureka)
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)|修订版
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- SpringCloud 之第一篇: 服务的注册与发现(Eureka)
- SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- android 补间动画
- 部落卫队问题
- linux中日志管理
- 链接器脚本
- 颜色空间:RGB,CMY,HSV,HSL,Lab详解
- SpringCloud第一篇-Eureka:服务的注册与发现
- 10.19
- 单链表 尾插入法
- Discuz can't find "pre_forum_rsscache"的解决方案
- 树和二叉树
- jvm知识点总览
- 二叉树系列五:判断二叉树是否为完全二叉树
- 笔试10.19-2
- 解密Spring Boot整合Dubbo RPC框架