Spring Cloud Eureka实践
搭建Eureka配置中心
1.新建Spring模块 sp05-eureka
2.pom.xml 继承springcloud1
<properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.4.1</version><configuration><mainClass>cn.tedu.sp05.Sp05EurekaApplication</mainClass></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url></repository></repositories>
3.配置yml文件
- 禁用自我保护模式
- 配置主机名 hostname
- 针对单台服务器不注册也不拉取
# 应用名称
spring:application:name: eureka-server
server:port: 2001
eureka:server:enable-self-preservation: false #禁用保护模式instance:hostname: eureka1client:#对单台服务器不注册也不拉取register-with-eureka: falsefetch-registry: false
4.启动类的注解
- @EnableEurekaServer,触发eureka服务器的自动配置
package cn.tedu.sp05;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication
@EnableEurekaServer
public class Sp05EurekaApplication {public static void main(String[] args) {SpringApplication.run(Sp05EurekaApplication.class, args);}
}
5.浏览器访问注册表
http://localhost:2001/
实现效果
Eureka运行机制
1. 注册
- 客户端向服务器注册时,会一次次反复注册,直到注册成功为止
2. 拉取
- 客户端每30s拉取一次注册表,更新本地的缓存注册表
3. 心跳
- 客户端每30s发送一次心跳数据,服务器连续三次收不到一次心跳数据,会把注册信息从注册表里删除
4. 自我保护模式
- 在网络中断时,15min内85%服务器出现心跳异常(1次就算心跳异常),自动进入自我保护模式,保护所有注册信息都不删除
- 网络恢复后可以自动退出保护模式
- 开发调试期间,可以禁用保护模式,避免影响测试
客户端连接Eureka
1. 添加 eureka client依赖
- 添加至2.3.4
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
2. yml配置eureka 地址
- http://eureka1:2001/eureka
- /eureka为子路径,客户端调用eureka的API路径
- 将配置添加至2.3.4
eureka:client:service-url: # 可以从云服务商购买不同地点的 eureka服务器# 这里可以改成云服务商提供的地点# 自己的服务器只能用defaultZone defaultZone: http://eureka1:2001/eureka
3. 修改host配置文件
添加eureka1与eureka2
实现效果
因为有默认集群服务器,所以会报错
实现高可用
- 商品的高可用
1. 修改item的启动配置
- 添加springboot启动参数: --server.port=8001
- 复制启动配置,修改端口 8002
实现效果
2.修改05yml文件
application.eureka1.yml
eureka:instance:hostname: eureka1client:#集群服务器之间互相注册和拉取register-with-eureka: truefetch-registry: true# 1 连接2service-url:defaultZone: http://eureka2:2002/eureka
application.eureka2.yml
eureka:instance:hostname: eureka2client:#集群服务器之间互相注册和拉取register-with-eureka: truefetch-registry: true# 1 连接2service-url:defaultZone: http://eureka1:2001/eureka
4. 实现eureka的高可用
1. 添加eureka1和eureka2的profile配置
2. 配置启动参数
5. 修改2.3.4yml
02
spring:application:name: item-service
#item 8001 user8101 order8201
server:port: 8001
eureka:client:service-url:# 可以从云服务商购买不同地点的 eureka服务器# 这里可以改成云服务商提供的地点# 自己的服务器只能用defaultZonedefaultZone: http://eureka1:2001/eureka,http://eureka2:2002/eureka
03
spring:application:name: user-service
server:port: 8101
# Demo数据
#[{7,xx,xx},{8,xx,xx},{9,xx,xx}]
sp:user-service:users: "[{\"id\":7, \"username\":\"abc\",\"password\":\"123\"},{\"id\":8, \"username\":\"def\",\"password\":\"456\"},{\"id\":9, \"username\":\"ghi\",\"password\":\"789\"}]"
eureka:client:service-url:# 可以从云服务商购买不同地点的 eureka服务器# 这里可以改成云服务商提供的地点# 自己的服务器只能用defaultZonedefaultZone: http://eureka1:2001/eureka,http://eureka2:2002/eureka
04
spring:application:name: order-service
server:port: 8201
eureka:client:service-url:# 可以从云服务商购买不同地点的 eureka服务器# 这里可以改成云服务商提供的地点# 自己的服务器只能用defaultZonedefaultZone: http://eureka1:2001/eureka,http://eureka2:2002/eureka
ribbon:MaxAutoRetries: 1MaxAutoRetriesNextServer: 2
实现效果
fegin的远端调用和 ribbon负载均衡和重试
1.添加feign依赖至04订单工程
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
2.启动类添加注解
@EnableFeignClients 触发Feign的自动配置,会自动扫描接口,创建动态代理对象
package cn.tedu.sp04;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableFeignClients
public class OrderApp {public static void main(String[] args) {SpringApplication.run(OrderApp.class, args);}
}
3. 定义远程调用接口
ItemClient
package cn.tedu.sp04.feign;import cn.tedu.sp01.entity.Item;
import cn.tedu.web.util.JsonResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;import java.util.List;
/*1.调用哪个服务
* 2.调用服务的哪个路径
* 3.向这个路径提交什么参数
* */
@FeignClient(name = "item-service")
public interface ItemClient {@GetMapping("/{orderId}")JsonResult<List<Item>> getItems(@PathVariable String orderId);@PostMapping("/decreaseNumber")//协议体提交数据JsonResult<?> decreaseNumber(@RequestBody List<Item> items);
}
UserClient
package cn.tedu.sp04.feign;import cn.tedu.sp01.entity.User;
import cn.tedu.web.util.JsonResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam
@FeignClient(name = "user-service")
public interface UserClient {@GetMapping("/{userId}")JsonResult<User> getUser(@PathVariable Integer userId);@PostMapping("/{userId}/score")JsonResult<?> addScore(@PathVariable Integer userId,@RequestParam("score") Integer score);
}
4.修改OrderServiceImpl完成远端调用
package cn.tedu.sp04.service;import cn.tedu.sp01.entity.Item;
import cn.tedu.sp01.entity.Order;
import cn.tedu.sp01.entity.User;
import cn.tedu.sp01.service.OrderService;
import cn.tedu.sp04.feign.ItemClient;
import cn.tedu.sp04.feign.UserClient;
import cn.tedu.web.util.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;@Service
@Slf4j
public class OrderServiceImpl implements OrderService {// TODO: 表示将要完成的工作 远程调用商品获取商品列表// TODO: 表示将要完成的工作 远程调用用户获取用户数据@Autowiredprivate ItemClient itemClient;@Autowiredprivate UserClient userClient;@Overridepublic Order getOrder(String orderId) {log.info("获取订单,orderId="+orderId);JsonResult<List<Item>> items = itemClient.getItems(orderId);JsonResult<User> user = userClient.getUser(8);//真实应使用已经登录的用户id//Demo数据 其实应该向数据库查询数据Order order=new Order();order.setId(orderId).setItems(items.getData()).setUser(user.getData());return order;}@Override/*添加订单*/public void addOrder(Order order) {log.info("添加订单"+order);// TODO: 2021/11/15 远程商品,减少库存itemClient.decreaseNumber(order.getItems());// TODO: 2021/11/15 远程用户,增加积分userClient.addScore(order.getUser().getId(),1000);}
}
Ribbon负载均衡
- Feign集成Ribbon,默认启动负载均衡
Ribbon重试
- 调用后台服务时,如果失败的话可以自动发起重试调用
- (出异常、调用超时、服务器宕机)
- 默认启用
- 重试参数:
ribbon.MaxAutoRetries
单台服务器的重试次数 默认为0
ribbon.MaxAutoRetriesNextServer
更换服务器的次数 默认为1
ribbon.ReadTimeOut
默认1000毫秒超时
ribbon.ConnectionTimeout
与后台服务器建立连接的超时时间 默认1000
ribbon.OkToRetryOnAllOperations
是否对所有请求方式都重试,默认只对get重试
测试urlSpring Cloud Eureka实践相关推荐
- 在spring cloud eureka中使用ip而不是hostname
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_34173549/article/details/80640012 众所周知,spring cl ...
- Spring Cloud Eureka 自我保护机制
Spring Cloud Eureka 自我保护机制 Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这 ...
- Spring Cloud Eureka 入门 (三)服务消费者详解
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! "真正的进步 ...
- eureka 之前的服务如何关闭_干货分享 | 服务注册中心Spring Cloud Eureka部分源码分析...
友情提示:全文13000多文字,预计阅读时间10-15分钟 Spring Cloud Eureka作为常用的服务注册中心,我们有必要去了解其内在实现机制,这样出现问题的时候我们可以快速去定位问题.当我 ...
- Spring Cloud Eureka 入门 (二)服务提供者详解
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! "优秀不是过 ...
- eureka集群只注册一个_一、Spring Cloud Eureka服务注册中心
Sping boot Eureka是服务中心,管理各种服务功能包括服务的注册.发现.熔断.负载.降级等.Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装. 在du ...
- Spring Cloud 学习笔记(一) 之服务治理模块Spring Cloud Eureka 搭建注册中心
2019独角兽企业重金招聘Python工程师标准>>> 关于springboot的学习请参考前面的文章 接下来我们会开启一系列关于springcloud的学习文章. 一.概念 首先我 ...
- 《SpringCloud超级入门》Spring Cloud Eureka是什么?《八》
Spring cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责实现微服务架构中的服务治理功能. S ...
- Spring Cloud Eureka(三)实现一个高可用的注册中心
Spring Cloud Eureka(三)实现一个高可用的注册中心 实现一个高可用的注册中心 在微服务结构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须为服务的各个组件进行 ...
最新文章
- Mac OS X的快捷键
- monty python喜剧-【网络小说网中心】最经典的100部美剧,看到第一名瞬间服气!
- Matlab Robotic Toolbox V9.10工具箱(二):正/逆运动学
- Elasticsearch 冷热集群架构实战
- ABAP常用Function
- 学习如何写PHP MVC框架(1) -- 路由
- 【ArcGIS风暴】ArcGIS10.6获取栅格影像边界范围的三种方法案例详解
- 百度蜘蛛网站分两个服务器,SEOer需要将百度蜘蛛抓取时间降低到1秒以下
- 升级计算机方案,关于计算机升级方案
- apache commons lang架包介绍
- python读取多行函数_Python3基础 __doc__ 单行与多行函数文档
- Jenkins集群搭建
- linux备份整个系统
- ajax有哪些回调函数
- android感应不了夜神模拟器,夜神模拟器使用(检测不到)
- esxcli software vib 命令为 ESXi 5.x/6.x 主机安装补丁程序 (2008939)
- 12.Oracle Redo重做日志管理
- Muti-Barrage 一个多功能的Android弹幕库
- /etc/rc0.d----rc3.d---rcS.d这些目录的意义
- 小米蓝牙键盘怎么连接_小米2手机连接使用蓝牙键盘和蓝牙鼠标教程(原创)
热门文章
- 用计算机画函数图象的软件,信息技术应用 用计算机画函数图象 .ppt
- 常用的表单验证Js方法,身份证、手机号码、固定电话正则验证建议收藏
- (20)(20.4) 飞行前测试控制装置
- 【Python】将txt文件转换为html
- unity的贴花方案
- 卷积膨胀 Dilation
- android5.1手机root,最新的安卓5.1.1 ROOT教程(不需要刷第三方内核)
- java浮雕矩阵,常见的图像特效处理算法(基于android)
- 连接服务器失败请检查网络是否启用修复程序,Win10出现网络连接问题的七种修复方法...
- 公众号如何关联小程序?