搭建服务提供方集群

将服务注册至eureka集群中,文中用到了http://euk1.com,是本地服务,需要修改hosts文件

127.0.0.1 euk1.com
127.0.0.1 euk2.com

pom.xml

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

配置文件

  • application.properties

    spring.profiles.active=provider1spring.application.name=providereureka.client.service-url.defaultZone=http://euk1.com:7001/eureka/#自定义节点信息,可以根据节点信息来判断服务器,做个性化需求
    eureka.instance.metadata-map.info=provider#Actuator 开启哪些端点,为* 表示端点全部开启
    management.endpoints.web.exposure.include=*#Actuator 可以远程关闭服务节点,方便运维人员
    management.endpoint.shutdown.enabled=true# 每隔这个时间会主动心跳一次,默认值为30s,更新自己的状态。Eureka Server收到心跳后,会通知集群里的其它Eureka Server更新此实例的状态。
    eureka.instance.lease-renewal-interval-in-seconds = 5#服务剔除需要在Eureka Server端把自我保护关闭掉,注意是Server端关闭,不是client端
    #erueka.server.enable-self-preservation=false
    #设置服务过期时间配置,超过这个时间没有接收到心跳EurekaServer就会将这个实例剔除
    eureka.instance.lease-expiration-duration-in-seconds = 10#可以上报服务的真实健康状态
    eureka.client.healthcheck.enabled=true
  • application-provider1.properties

    server.port=81
    
  • application-provider2.properties

    server.port=82
    

MainController

随意写两个方法来测试服务是否注册成功

package com.ls.eureka.eurekaprovider;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Collections;
import java.util.Map;@RestController
public class MainController {@Value("${server.port}")String port;@GetMapping("/getHi")public String getHi() {return "Hi!,我的port:" + port;}}

启动项目

使用 http://localhost:81/getHi,http://localhost:82/getHi能正常访问服务。
访问 eureka服务端 http://localhost:7001/ 或者 http://localhost:7002/ ,provider项目作为服务提供方已经注册在eureka了

Rest服务调用

可以使用Rest API 去获取注册在eureka的服务(https://github.com/Netflix/eureka/wiki/Eureka-REST-operations)

注册到eureka的服务信息查看

http://localhost:7001/eureka/apps

get: {ip:port}/eureka/apps

注册到eureka的具体的服务查看

http://localhost:7002/eureka/apps/PROVIDER/WIN-2BA4UGIGEK3:provider:81

get: {ip:port}/eureka/apps/{appname}/{id}

服务续约 put:{ip:port}/eureka/apps/{appname}/{id}?lastDirtyTimestamp={}&status=up
更改服务状态 put:{ip:port}/eureka/apps/{appname}/{id}/status?lastDirtyTimestamp={}&value={UP/DOWN}
删除状态更新 delete:{ip:port}/eureka/apps/{appname}/{id}/status?lastDirtyTimestamp={}&value={UP/DOWN}
删除服务 delete: {ip:port}/eureka/apps/{appname}/{id}

Spring Boot Actuator:健康检查、审计、统计和监控

SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等(这有一篇介绍文章spring boot actuator监控详细介绍一(超级详细))

由于server和client通过心跳保持 服务状态,而只有状态为UP的服务才能被访问。看eureka界面中的status。http://localhost:7001/eureka/status

比如心跳一直正常,服务一直UP,但是此服务DB连不上了,无法正常提供服务。
此时,我们需要将微服务的健康状态提交到server端。需要启动eureka的健康检查,这样微服务就会将自己的健康状态同步到server端。

开启手动控制

pom.xml

<!-- Spring Boot Actuator:健康检查、审计、统计和监控。用于上报节点信息 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.properties

## 可以上报服务的真实健康状态
eureka.client.healthcheck.enabled=true#Actuator 开启哪些端点,为* 表示端点全部开启
management.endpoints.web.exposure.include=*#Actuator 可以远程关闭服务节点,方便运维人员
management.endpoint.shutdown.enabled=true

改变健康状态的Service

@Service
public class HealthStatusService implements HealthIndicator {private Boolean status = true;public void setStatus(Boolean status) {this.status  = status;}@Overridepublic Health health() {// TODO Auto-generated method stubif(status)return new Health.Builder().up().build();return new Health.Builder().down().build();}public String getStatus() {// TODO Auto-generated method stubreturn this.status.toString();}
}

测试用的Controller

@GetMapping("/health")
public String health(@RequestParam("status") Boolean status) {healthStatusSrv.setStatus(status);return healthStatusSrv.getStatus();
}

测试修改服务状态

http://localhost:81/health?status=false

provider中看到日志

Saw local status change event StatusChangeEvent [timestamp=1605522480678, current=DOWN, previous=UP]

Eureka Server中看到日志

Registered instance PROVIDER/WIN-2BA4UGIGEK3:provider:81 with status DOWN (replication=true)

此时服务列表任然显示provider服务,不会将服务剔除,只会标注为服务下线

http://localhost:81/health?status=true 会将服务重新上线

安全配置

开启Eureka安全连接

application.properties

如果没有配置账号密码,则会再启动的时候输出一串随机密码,打印在控制台,
默认账号是user
Using generated security password: 178c5cf8-7f2a-4b38-a25b-6aed7a11c77d
开启之后,访问eureka服务就需要输入账号密码才行,且注册的时候需要将账号密码也加载链接上
如下:
eureka.client.service-url.defaultZone=http://ls:123@euk2.com:7002/eureka/

spring.security.user.name=ls
spring.security.user.password=123

pom.xml

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

关闭防止跨域攻击

spring.security带有防止跨域攻击的模块,需要手动关闭

javax.ws.rs.WebApplicationException: com.fasterxml.jackson.databind.exc.MismatchedInputException: Root name 'timestamp' does not match expected ('instance') for type [simple type, class com.netflix.appinfo.InstanceInfo]

手动关闭

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{@Overrideprotected void configure(HttpSecurity http) throws Exception {// TODO Auto-generated method stubhttp.csrf().disable();super.configure(http);}
}

在服务端增加配置类

服务使用方

从服务端获取可以使用的服务列表,进行调用

配置文件

server.port=83spring.application.name=consumereureka.client.service-url.defaultZone=http://euk1.com:7001/eureka/#自定义节点信息
eureka.instance.metadata-map.info=consumer#可以远程关闭服务节点
management.endpoint.shutdown.enabled=true#可以上报服务的真实健康状态
#eureka.client.healthcheck.enabled=true

MainController

package com.ls.eureka;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;@RestController
public class MainController {@Value("${server.port}")String port;@AutowiredDiscoveryClient discoveryClient;@AutowiredLoadBalancerClient loadBalancerClient;@GetMapping("/getHi")public String getHi() {return "Hi!,我的port:" + port;}/*** 获取服务列表* @return*/@GetMapping("/getServices")public String getServices() {List<String> services = discoveryClient.getServices();return services.toString();}/*** 根据服务名称获取服务列表* @return*/@GetMapping("/getInstances")public Object getInstances() {return discoveryClient.getInstances("provider");}/*** 根据服务名称获取服务列表,测试服务访问* @return*/@GetMapping("/getInstancesList")public String getInstancesList() {//discoveryClient Spring cloud 的client只会返回Up状态下的实例List<ServiceInstance> instancesList = discoveryClient.getInstances("provider");System.out.println("instancesList.size:==========="+instancesList.size());for (ServiceInstance instance : instancesList) {System.out.println(instance.toString());}if(instancesList.size() > 0){ServiceInstance instance = instancesList.get(0);String url = instance.getUri().toString()+"/getHi";System.out.println(url);RestTemplate restTemplate = new RestTemplate();String respStr = restTemplate.getForObject(url, String.class);System.out.println(respStr);return respStr;}return "";}/*** 根据服务名称获取服务列表,使用Ribbon做负载均衡策略 测试服务访问* @return*/@GetMapping("/getInstancesListByLb")public String getInstancesListByLb() {//discoveryClient Spring cloud 的client只会返回Up状态下的实例List<ServiceInstance> instancesList = discoveryClient.getInstances("provider");ServiceInstance instance = loadBalancerClient.choose("provider");String url = instance.getUri().toString()+"/getHi";System.out.println(url);RestTemplate restTemplate = new RestTemplate();String respStr = restTemplate.getForObject(url, String.class);System.out.println(respStr);return respStr;}
}

getInstancesListByLb

使用了Ribbon作为负载均衡,会根据负载策略将请求分发到不同的provider上。

eureka 服务注册发现demo相关推荐

  1. 《微服务系列:Eureka服务注册发现中心》

    说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正.若 ...

  2. Eureka服务注册发现原理

    文章目录 Eureka服务注册发现原理 客户端启动时如何注册到服务端 服务端存储客户端信息 心跳机制和服务剔除机制 Eureka服务注册发现原理 客户端启动时如何注册到服务端 Eureka客户端在启动 ...

  3. Eureka服务注册发现实例

    ** 一.搭建服务注册中心 1.通过idea新建一个spring boot工程,方法可参考Spring boot初体验.在依赖项选择的时候选择Cloud Discovery --Eureka Serv ...

  4. Spring-Cloud-Eureka服务注册发现中心server+client案列模拟说明

    Spring-Cloud概念理解 Eureka源码分析 Eureka简介及原理 上面三个博文链接大致扫一篇,在读一下下面我所阐述的,然后再回过头来细细翻看一下上面的三个博文,你会发现,原来如此 Eur ...

  5. SpringCloud笔记(Hoxton)——Netflix之Eureka服务注册与发现

    基础应用 Eureka简介 Eureka是一个基于REST的服务,主要在AWS云中使用,定位服务来进行中间层服务器的负载均衡和故障转移. SpringCloud封装了Netflix公司开发的Eurek ...

  6. springcloud Eureka服务注册和发现

    一,Eureka基本介绍: Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper). Eureka 采用了 C-S 的设计架构 ...

  7. 详解Eureka服务注册与发现和Ribbon负载均衡【纯理论实战】

    Eureka服务注册与发现 Eureka简介 在介绍Eureka前,先说一下CAP原则 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability ...

  8. SpringCloud(三) Eureka之服务注册发现以及实现工程间调用

    概述:本章节将介绍Eureka客户端如何与EurekaServer端链接,以及生产者工程如何将服务注册到Eureka注册中心中去,消费者工程怎么从EurekaServer端获取生产者工程的服务地址,并 ...

  9. 二、Eureka服务注册与发现

    SpringCloud系列目录: 一.SpringCloud简介 二.Eureka服务注册与发现 三.Eureka注册与发现之Eureka Comsumer 四.Eureka.Server Provi ...

最新文章

  1. 读取excel日期 c++_实例9:用Python自动生成Excel档每日出货清单
  2. 第一篇 献给一次线上100%CPU
  3. 使用LiveClick升级您的实时书签
  4. mysql c语言教程,C语言调用mysql快速教程(精华篇).pdf
  5. ICCV 2021 LVIS Challenge 长尾分布实例分割挑战赛,冠军解决方案
  6. ScrollView中布局不能充满ScrollView的问题
  7. 恢复U盘空间大小的方法
  8. STM32 无法使用IAR下载程序问题
  9. Rosalind全排列的问题
  10. linux 跑天龙八部游戏脚本,天龙八部脚本免费版2019export
  11. 图片路径不存在,替换问题图片
  12. zcmu——1601: 卡斯丁狗去挖矿(01背包-三维数组)
  13. 2012年度最佳 Web 前端开发工具和框架——《上篇》
  14. excel相乘再相加_EXCEL数组计算【SUMPRODUCT】多条件相乘再相加
  15. 顾维维就任百度新兴业务及技术体系市场负责人
  16. 中国聊天工具,谁执牛耳?
  17. 【Linux】shell脚本实战-if多分支条件语句详解
  18. sim卡没坏但苹果手机无服务_苹果iPhone手机信号弱或无服务怎么解决【解决方法】...
  19. 什么是gadget,以及64位libc如何泄露的问题
  20. 使用功率分析仪评测一款华为honor蓝牙鼠标的低功耗数据,仅供参考!

热门文章

  1. 糯米团—重制“iPhone团购信息客户端”(四)
  2. input中文输入多次触发oninput事件
  3. mysql判断是否迟到_Mysql总结
  4. GCN频域视角相关——傅里叶变换、拉普拉斯变换、拉普拉斯算子、拉普拉斯矩阵、卷积
  5. element ui 样式穿透
  6. Sucess is a continuous journey
  7. Google Earth Engine(GEE)—— 各矿区时序NDVI变化图(包含具体的运行函数)
  8. 从数据加密到PostgreSQL SSL认证连接
  9. 达梦数据库删除表提示锁超时问题
  10. 黄牌专业计算机科学与技术,教育部公布中国大学“红黄绿牌”专业