SpringBoot Cloud eureka 注册中心
SpringBoot Cloud是什么
Spring Cloud是一个分布式的整体解决方案。 Spring Cloud 为开发者提供了在
分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐, leader选举,分布式session,集群状态)中快速构建的工具,
使用Spring Cloud的开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接。
SpringCloud分布式开发五大常用组件
• 服务发现——Netflix Eureka (发现了 英 [,jʊ(ə)'riːkə] )
• 客服端负载均衡——Netflix Ribbon (缎带 英 ['rɪbən] )
• 断路器——Netflix Hystrix (断路器)
• 服务网关——Netflix Zuul (路由网关)
• 分布式配置——Spring Cloud Config (配置)

https://www.processon.com/diagraming/5cef1a48e4b05d5b38bdb090
特别强调: springboot和springcloud如果版本不兼容会报异常java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava/lang/Class;)V
springcloud中eureka搭建
建一个空项目springboot-07-cloud,内有三个子模块
- eureka-server (注册中心)
- cloud-provider (服务提供者)
- cloud-consumer (消费者)
三个子模块文件结构如下
springboot-07-cloud base分支中三个子模块如下
| springboot-07-cloud中三个子模块 | eureka-server (注册中心) |
cloud-provider (服务提供者) |
cloud-consumer (消费者) |
|
|
|
|
| pom.xml区别 |
<?xml version="1.0" encoding="UTF-8"?> |
<?xml version="1.0" encoding="UTF-8"?> |
<?xml version="1.0" encoding="UTF-8"?> |
| application.yml区别 |
server: 默认eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,将register-with-eureka置为false 若未禁用eureka服务注册中心的客户端注册行为,需提供service-url注册中心地址 |
server: |
server: |
特别注意: springboot和springcloud的版本有对应要求, 本样例用的是
springboot <version>1.5.21.RELEASE</version> 对应 springbloud <spring-cloud.version>Edgware.SR6</spring-cloud.version>
在实际开发过程中,我们需要更详细的版本对应:以伦敦地铁站命名
| spring-boot-starter-parent | spring-cloud-dependencies | ||||
|---|---|---|---|---|---|
| 版本号 | 发布日期 | 版本号 | 发布日期 | ||
| 1.5.2.RELEASE | 2017年3月 | 稳定版 | Dalston.RC1 | 2017年未知月 | |
| 1.5.9.RELEASE | 2017年11月 | 稳定版 | Edgware.RELEASE | 2017年11月 | 稳定版 |
| 1.5.16.RELEASE | Edgware.SR5 | ||||
| 1.5.20.RELEASE | Edgware.SR5 | ||||
| 2.0.2.RELEASE | 2018年5月 | Finchley.BUILD-SNAPSHOT | 2018年未知月 | ||
| 2.0.6.RELEASE | Finchley.SR2 | ||||
| 2.1.4.RELEASE | Greenwich.SR1 | ||||
| 2.2.2.RELEASE | Hoxton.SR1 | 2019年 | |||
| 待更新... | |||||
eureka-server (注册中心)
EurekaServerApplication.java
注册中心启动入口 , 注意需要@EnableEurekaServer注解支持
package com.example.eurekaserver; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /**
* 使用注册中心步骤
* 1. application.yml配置
* 2. @EnableEurekaServer注解添加
*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication { public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
} }
cloud-provider (服务提供者)
CloudProviderApplication.java
生产者启动类, 不需要额外注解, 因为做了注册到eureka上的配置, 就可以直接把@RestController注解的所有接口自动注册到eureka注册中心 , 供消费者调用.
package com.example.cloud.provider; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class CloudProviderApplication { public static void main(String[] args) {
SpringApplication.run(CloudProviderApplication.class, args);
} }
CloudProviderController.java
package com.example.cloud.provider.controller; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class CloudProviderController {
static int number; @GetMapping("/buyTicket")
public String buyTicker(){
return "ticker "+ ++number;
}
}
cloud-consumer (消费者)
CloudConsumerApplication.java
消费者启动入口 , 注意需要开启@EnableDiscoveryClient注解
package com.example.cloud.consumer; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /**
* cloud 客户端调用时需要引入 @EnableDiscoveryClient 注解
*/
@SpringBootApplication
@EnableDiscoveryClient
public class CloudConsumerApplication { public static void main(String[] args) {
SpringApplication.run(CloudConsumerApplication.class, args);
} }
MyConfiguration.java
需要把RestTemplate类组装到springboot容器中, 专门用于调用eureka上发现的服务
package com.example.cloud.consumer.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate; @Configuration
public class MyConfiguration { @LoadBalanced//负载均衡
@Bean//需要把RestTemplate装配进来,专门用于调用Eureka上发现的服务
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
CloudConsumberController.java
使用 http://localhost:8002/buyTicket 访问
package com.example.cloud.consumer.controller; import com.netflix.discovery.converters.Auto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; @RestController
public class CloudConsumberController { @Autowired
RestTemplate restTemplate; //http://localhost:8002/buyTicket
@GetMapping("/buyTicket")
public String buyTicker(){
String retData = restTemplate.getForObject("http://PROVIDER/buyTicket",String.class);//
retData = "成功购买" + retData;
return retData;
} }
访问
访问springcloud的eureka-server 注册中心 http://localhost:8761/

访问cloud-consumer消费者提供的controller接口 http://localhost:8002/buyTicket 后,浏览器显示如下
成功购买ticker 1
注意Status一栏显示的是服务实例名, 默认取名规则为${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}} , 最后的写法意为如果spring.application.instance_id没有定义,则取server.port, 如果已定义了则舍掉server.port取spring.application.instance_id
遇见异常
Error creating bean with name 'gsonBuilder' defined in class path resource
异常详情如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gsonBuilder' defined in class path resource [org/springframework/boot/autoconfigure/gson/GsonAutoConfiguration.class]:Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.google.gson.GsonBuilder]: Factory method 'gsonBuilder' threw exception; nested exception is java.lang.BootstrapMethodError: java.lang.NoSuchMethodError: com.google.gson.GsonBuilder.setLenient()Lcom/google/gson/GsonBuilder
那是因为整个项目没有引入parent依赖 , 添加如下<parent>即可
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
Eureka服务心跳检测(健康检测机制)
1.Eureka服务端
在某一些时候注册在Eureka的服务已经挂掉了,但是服务却还留在Eureka的服务列表的情况。
Eureka服务端的配置application.yml:
server:
port: 9501 eureka:
instance:
hostname: 127.0.0.1
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
# 关闭自我保护机制
enable-self-preservation: false
# 每隔10s扫描服务列表,移除失效服务
eviction-interval-timer-in-ms: 10000
默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。
自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。
自我保护机制的工作机制是如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:
1、Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
2、Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
3、当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。
# 该配置可以移除这种自我保护机制,防止失效的服务也被一直访问 (Spring Cloud默认该配置是 true)
eureka.server.enable-self-preservation: false # 该配置可以修改检查失效服务的时间,每隔10s检查失效服务,并移除列表 (Spring Cloud默认该配置是 60s)
eureka.server.eviction-interval-timer-in-ms: 10
2.Eureka客户端
Eureka客户端的配置application.yml:
eureka:
instance:
# 每隔10s发送一次心跳
lease-renewal-interval-in-seconds: 10
# 告知服务端30秒还未收到心跳的话,就将该服务移除列表
lease-expiration-duration-in-seconds: 30
client:
serviceUrl:
defaultZone: http://localhost:9501/eureka/ server:
port: 9502
spring:
application:
name: service-hi
# 该配置指示eureka客户端需要向eureka服务器发送心跳的频率 (Spring Cloud默认该配置是 30s)
eureka.instance.lease-renewal-interval-in-seconds: 10 # 该配置指示eureka服务器在接收到最后一个心跳之后等待的时间,然后才能从列表中删除此实例 (Spring Cloud默认该配置是 90s)
eureka.instance.lease-expiration-duration-in-seconds: 30
SpringCloud:Eureka的健康检测机制==>https://blog.csdn.net/akaks0/article/details/79512680
遗留问题
defaultZone 需要添加/eureka后缀? 是的默认就这样.
我的git项目地址
https://gitee.com/KingBoBo/springboot-07-cloud base分支
入门篇
Eureka 服务的注册和发现==>https://www.cnblogs.com/fangwu/p/8975990.html
进阶篇
SpringBoot SpringCloud集群==>https://www.cnblogs.com/whatlonelytear/p/10894161.html
SpringBoot Cloud eureka 注册中心的更多相关文章
- IDEA 创建Spring cloud Eureka 注册中心
IDEA 创建Spring cloud Eureka 注册中心 一. 首先创建一个maven project Next之后填好groupId与artifactId,Next之后填好项目名与路径,点击F ...
- Spring Cloud Eureka 注册中心集群搭建,Greenwich 最新版!
Spring Cloud 的注册中心可以由 Eureka.Consul.Zookeeper.ETCD 等来实现,这里推荐使用 Spring Cloud Eureka 来实现注册中心,它基于 Netfl ...
- Spring Cloud Eureka注册中心(快速搭建)
Spring Cloud 详解Eureka注册中心@(微服务)[java|spring-cloud|eureka] Eureka 注册中心是入门Spring Cloud微服务架构的必学组件,是学习所有 ...
- spring cloud Eureka注册中心集群搭建
1.创建springcloud-eureka maven项目 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0&quo ...
- Spring Cloud Eureka 注册中心高可用机制
一.Eureka 正常工作流程 Service 服务作为 Eureka Client 客户端需要在启动的时候就要向 Eureka Server 注册中心进行注册,并获取最新的服务列表数据. Eurek ...
- Spring Cloud Eureka 注册中心 服务消费者 服务提供者之间的关系以及高可用之间的联系
注册中心:提供服务的注册与查询(发现) 服务提供者:服务的提供方,提供服务的一方. 服务消费者:服务的消费方,使用服务的一方. 我们没有注册中心,服务提供者与服务消费者同样可以调用,通过spring中 ...
- Spring Cloud Eureka 注册安全一定要做到位!
/eureka/ 参考配置如下: defaultZone: http://javastack:javastack@eureka1:8761/eureka/, http://javastack:java ...
- 孰能巧用 Spring Cloud 服务注册中心Eureka
Eureka介绍 在Spring Cloud Netflix 整合技术栈中,Eureka既可以作为服务注册中心也可以用于服务发现对整个微服务架构起着最核心的整合作用. Eureka是基于REST(Re ...
- Spring Cloud第二篇 | 使用并认识Eureka注册中心
本文是Spring Cloud专栏的第二篇文章,了解前一篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 一.Sprin ...
随机推荐
- HZOI20190810 T1
A:blue(青蛙乱跳) 好像很多人都是用的队列?甚至还有用set 然而...博主太蒻了,只能找一个sb的规律 我们来手模一个样例: 10 9 16 30 2 4 6 9 11 15 18 19 25 ...
- vue.js_12_vue的watch和computed
1.watch用来监测指定Vue实例上的数据变动. watch主要用于监控vue实例的变化,它监控的变量当然必须在data里面声明才可以,它可以监控一个变量,也可以是一个对象. 1.>使用wat ...
- 19-10-15-Night-E
信心赛??高考赛…… 过程 T1码了暴力+随机化. T2没码完.$Kuku$了 T3写了暴力+ puts("86400\n-1"); 骗了点分. T1 ××你告诉我CF E题是T1 ...
- spring中关于<context:component-scan>的使用说明
通常情况下我们在创建spring项目的时候在xml配置文件中都会配置这个标签,配置完这个标签后,spring就会去自动扫描base-package对应的路径或者该路径的子包下面的java文件,如果扫描 ...
- 【MFC学习笔记】菜单和工具栏
1 菜单栏 1.1 在对话框中加入菜单: 打开Resource View资源视图, *.rc文件—Add Resources —Menu,即可加入菜单. 注:①菜单项中含有“...”表示点击后会弹出对 ...
- Acer笔记本蓝牙功能不可用
在电脑运行过程中,本应该如下所存在的蓝牙图标不存在了: 打开设置,本应该可以选择开关的蓝牙开关按钮也不存在了: 电脑的蓝牙功能无法使用: 处理方法: 在C:\windows\sysytem32\文件夹 ...
- php数据几行代码导出到excel(非插件)
<?php header("Content-type:application/vnd.ms-excel"); header("Content-Disposition ...
- loj6402 校门外的树(dp,多项式求逆)
https://loj.ac/problem/6402 庆祝一下,,,第一个我自己做出来的,,,多项式的题(没办法,我太弱 虽然用了2个小时才想出来,但这毕竟是0的突破…… 首先声明,虽然我写的题解很 ...
- 几个树形dp
1.重建道路 树形dp基础题,f[i][j]表示在i这个点我和我的子树联通块大小为j最少砍几条边. 转移的时候,到下一个子树时上一个子树所有答案先++(此树直接砍掉不贡献答案),再继续dp. 注意更新 ...
- css3动画曲线运动
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...