
微服务
文章平均质量分 69
起风哥
这个作者很懒,什么都没留下…
展开
-
微服务框架需要处理哪些问题?
正常情况下数据结构分为特定数据,非特定数据特定数据,比如记录登入相关的信息非特定数据,比如一些业务处理的状态需要流转到下一个服务。原创 2023-01-22 01:26:31 · 2281 阅读 · 0 评论 -
async-excel整合站内信通知用户体验感满满
业务处理类还是该怎么写怎么写,所以我们来讲讲callback中做了什么事情,首先我们判断导出结果是成功还是失败,有没有异常,根据不同的类型我们包装不同的消息内容类型,如果出现异常了我们包装一个纯文本消息,如果导出正常并且有链接我们包装一个下载链接的消息最后通过消息工具类发送广播消息给mq。在回到之前下消息中心我们写了个消费者,监听广播消息,我消费者可能部署多个节点,所以客户端可能连接在不同的节点上,所以消费者在收到消息的时候判断下目标客户端有没有连接在当前节点,如果不存在消息直接丢弃,如果存在则发送出去。原创 2023-01-13 21:06:55 · 1182 阅读 · 0 评论 -
springboot+netty实现站内消息通知(完整代码)
见名知意,就是channel 初始化器,当每个客户端创建连接时这里面的代码都会执行一遍。问题:哪些实例可以声明成单例,或者交给spring管理?因为如果每个连接都创建这么一大堆对象,可以想像1万个连接,这里会多占用多少内存出来?这个问题也不难回答,没有中间态,线程安全的类是可以声明成单例的,所以我们顺着这个方向大概就可以知道哪些是可以作为单例进行声明得。授人以鱼不如授人以渔。原创 2022-12-09 10:11:04 · 3907 阅读 · 1 评论 -
使用async-excel进行多sheet异步导出
业务上如果需要单sheet导出,有时有需要将多个单sheet导出合并到一个excel里面此时,代码写起来也是颇为蛋碎,但是在async-excel中,你可以不改变原有任何逻辑,只需要在增加一个简单的controller方法即可。DataExportParam 内部携带了个map,你可以自由传参,在不同的handler中可以按需获取。原创 2022-11-28 14:55:08 · 886 阅读 · 0 评论 -
当try_files遇上gateway是如何产生火花的
我们做了多分支管理环境隔离,一套满足开发调试、测试、产品验收、多需求并行开发的千人千面的环境。请求进行精准路由,其中有个环节是需要将前端项目作为一个服务注册到注册中心。环境下我们可以利用生命周期回调来执行脚本,在项目启动成功后执行注册,项目停止前删除实例,由于前端项目不容易挂,所以直接注册一个永久节点,不用临时节点所以,不用心跳。此时找到的是文件就不会发生重定向,而是直接访问了文件。重点来了此时如果你的前端项目用的时。下也会出现这个问题。进行访问的,所以此时重定向的地址变成了。配置是这样的,当然如果你是。原创 2022-09-08 11:35:05 · 1031 阅读 · 0 评论 -
使用shell注册服务到nacos
想将前端项目注册到nacos中,用来做标签路由,但是又不想再机器上再引入其它组件的情况下可以使用shell调用nacos的接口直接注册,并启动一个死循环保持住心跳即可。启动服务返回结果如下。原创 2022-09-06 19:12:11 · 621 阅读 · 0 评论 -
原来spring的父子容器还可以这样用
至此,又想到一个点,其实这也是之前微服务架构下特别头疼的一个问题,就是一些所谓的公共特性的服务,比如一些死的缓存类的东西,比如字典。以及一些配置,每次都要去调用公共服务,这太损耗性能以及开发成本太高了,如果可以直接使用一个子容器,将它包到各个服务去,并且提供一个公共数据源,将这部分高频,低效的内容高效化。我也不反驳,这个就跟违背数据库范式一个原则,采取适当冗余,不要死读书。然后要还需要提供个接口给外部获取bean,因为父容器无法获取子容器的bean。利用这样的特性,我可以把数据源声明在子容器内。...原创 2022-08-31 16:01:08 · 647 阅读 · 0 评论 -
超好用的excel异步导入导出组件
1、asyncexcel基于阿里的easyexcel包装,抽取异步骨架,不改变easyexcel的特性2、有个小坑就是@excelproperty注解的index无法使用了,所以编写excel model的时候需要注意编写顺序需要于excel中的表头顺序一致。......原创 2022-08-27 10:33:52 · 5053 阅读 · 3 评论 -
微服务项目下冗余数据如何同步?
本身这是一种反范式的做法,但是有时候你又不得不这么做,因为这样不用进行跨服务查询,而名称的修改本身是个低频操作,所以如果你选择只存id,而不冗余名称,你会发现,服务间调用大大增加,性能急剧下降。前端一个订单列表可能需要将仓库,商品,等信息显示在一个页面上,此时你查一个订单列表就需要调用各个服务,而每一次调用的目的仅仅是为了取一个字段。一般这种数据冗余是在三范式的基础上违反第三范式的冗余也就是依赖传递,所以此时在表中的数据一定存在一个被传递的唯一id,比如,商品id,商品名称,商品名称就是被冗余的字段。...原创 2022-08-15 09:57:11 · 1737 阅读 · 3 评论 -
无坑手撸istio
首先查看版本对照表【support-status-of-istio-releases】我们的kubernetes版本是1.19.16,支持1.8~1.12我们用1.12安装接着开始安装查看【getting-started】查看发布版本【releases】下载解压对应版本,1.12.5+ 为已知的无漏洞版本,所以我们选1.12.6curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.12.6 TARGET_ARCH=x86_64 sh -原创 2022-05-06 09:38:56 · 3005 阅读 · 0 评论 -
利用灰度方式解决测试开发环境共用实现
首先请看下图这个方案在之前的文章有介绍过【利用灰度方式解决微服务测试环境共用问题】,这里就不做太多的文字介绍了,图中内部请求部分省略掉了,和网关那一层的负载策略一致,获取头部version信息,然后负载到相应的服务去。网关层比内部服务调用多做了一件事情就是ip绑定操作。整个k8s集群维护一套跟生成一样的稳定版本,当没有进行ip绑定操作时,请求不会调用到开发机器去,就不会出现一些乱七八糟的问题:比如谁打了个断点,然后请求一致pending到超时之类的。我们此处采用git 分支号作为负载的版本号,关于g原创 2021-12-24 00:38:53 · 1209 阅读 · 0 评论 -
springboot整合skywalking将接口链路添加到responeHeader中
如题,也许有人觉得做这个有点多此一举,但是个人感觉这个的必要性还是有的。不为别的就为了省那么几秒中的查找时间。总体对微服务开发调试上就会有一些微小的提升那也是方便开发小伙伴的一种优化,好的框架就是这么一点一滴的优化过来的。废话不多说,先谈谈总体思路最后给个实现。1、首先要对头部进行操作我们可以在拦截器或者过滤器中动手脚2、需要获取到skywalking的服务地址以及traceId思路就是这两步看着就很简单获取traceId需要引入日下jar包。<dependency>原创 2021-06-21 10:41:00 · 1005 阅读 · 1 评论 -
业务模型抽象与业务流程抽象
1、什么叫业务模型例:订单、库存、商品这类的名词都可以称之为模型。例:订单可能分为实物类订单,服务类订单等,那么这里就提出一个挑战如何进行抽象。一个好的业务模型抽象能使得你的业务模型可复用。例:商品可以有spu,sku等不同的概念,还能进行多个商品打包销售,或者分为不同的品类,不同规格。或者不同商户不同价格等,或者随时间变更商品价格会不断变动。那么一个好的抽象,能够规避适应这些多样性的需求。2、什么叫业务流程例:下单、出库、入库等这类的动词可以称之为流程。例:下单过程涉及到支付,涉及到赠品,原创 2021-01-11 10:54:15 · 2316 阅读 · 0 评论 -
基于MQ的2PC分布式事务
上图阐释了如何基于mq实现2pc的分布式事务一阶段红线部分。二阶段为蓝线部分。图中展示了较为复杂的调用方式,S1调用S2、S3,S3又调用了S4。那么在此图基础上我们需要解决多节点问题。多节点可以直接使用mq广播的形式进行解决。还有一个点就是二阶段消息发送失败怎么处理?show your code根据上图我们可以很好的实现代码如下:此处基于rocketmq方式实现。...原创 2021-01-05 20:47:09 · 507 阅读 · 0 评论 -
利用灰度方式解决微服务测试环境共用问题
背景先简单交代下背景,好引出为什么要做这个事情,当项目团队大了之后我们经常会遇到的问题就是git流程的管理,以及遇到使用某套git管理流程之后所带来的成本和问题,例如:如果你使用gitflow 流程你就会发现你对开发人员对git操作本身就需要很高的水准,不利于不同层次的人员协同,第二你有可能生产版本不稳定经常需要修bug,不断拉取hotfix,然后走一套流程过于复杂。中间我们省略过release,或者使用pr模式,最终都以各种各样得问题彻底放弃了所谓得最佳实践,所以我决定走出一条自己得路,最后发现自己得路原创 2020-12-29 18:04:46 · 951 阅读 · 2 评论 -
基于rocketmq事务消息的分布式事务
先看下图以上图例展示了mq事务消息解决分布式事务的producer环节,consumer正常消费即可。show your code根据以上流程我们可以用rocketmq很简单的实现如下代码。为了减少部分业务代码入侵做了一点点封装;以下项目基于springboot2.1.3,此处引入jdbc,大家需要注意,可以和mybatis、mybatis-plus共用事务管理器(想了解jdbc与mybatis如何共用事务管理器,自行百度)。假如你是jpa 或者habinate 你就不能这样封装。<dep原创 2020-12-29 11:08:41 · 4444 阅读 · 9 评论 -
apache dubbo 2.7.x 生产者异常处理
dubbo生产者抛出来的自定义异常会被dubbo 框架重新封装成了RuntimeException,导致全局异常处理变成了系统异常,进到了 RuntimeException的Handler。翻了下dubbo的源码,发现它有个ExceptionFilter类专门做这个事情。@Activate(group = Constants.PROVIDER)public class ExceptionFilter implements Filter { private final Logger logger原创 2020-11-23 17:57:14 · 645 阅读 · 0 评论 -
seata分布式事务
目录什么是seata什么是TM、RM、TC使用seata发起一个分布式事务的流程开始使用什么是seata我们来看看它的全称seata(Simple Extensible Autonomous Transaction Architecture)简单可扩展的自治事务体系什么是TM、RM、TC1、TM(Transaction Manage) 事务管理器,也可以认为是事务的起点,配置一个全局事务的...原创 2020-10-10 11:08:57 · 783 阅读 · 0 评论 -
dubbo扩展解决开发环境共用问题
在开发环境下我们需要解决哪些开发问题呢?假如你公司有100个服务,并且服务间调用错综复杂可能是A-B-C-D-E,并且公司提供了一套开发环境,在多人开发的情况下,你的请求可能被负载到了别的开发者机器上,又或者你想要你的请求负载回你自己的本机,然后请求出去就消失无踪了。然而你又不能用直连的方式,因为你的服务还有对其它服务有依赖。需解决如下问题当你指定负载的时候优先负载至你自己本机当没有你本机的时候不能负载到别人机器上,必须调用开发环境公共服务。调用链中间隔性存在负载时,需要优先调用至本机例如:A原创 2020-06-02 11:48:13 · 746 阅读 · 3 评论 -
seata 客户端将配置文件放到配置中心
我们看到demo中的配置是registry.conf和file.conf中的格式长这样support { ## spring spring { # auto proxy the DataSource bean datasource.autoproxy = false }}但是apollo貌似不支持这种类型的配置文件啊把配置文件改成properties,内容也...原创 2019-12-26 10:29:43 · 3032 阅读 · 0 评论 -
Spring Cloud Gateway 拦截响应(数据截断问题)
最近因为上链路追踪后发现如果在服务层将异常拦截掉,在链路追踪界面上就不会显示异常链路信息,除了服务异常意外,系统的异常不会触发链路error,所以对服务层做了个变更,将所有未处理异常直接捕获后统一封装完抛出,这个时候就需要在网关层统一处理那么网关需要对响应数据进行拦截如果是 9999错误码,则封装后返回,如果是其它响应码或者其它数据直接返回。起初写法测试后发现数据过长时被截断。 retu...原创 2019-10-30 17:35:44 · 13470 阅读 · 1 评论 -
我们如何知道每次ribbon请求了哪个服务?
我们如何知道负载均衡每次请求了哪一个服务呢?关于ribbon的资料网络上已经很多了我不多做介绍,想要了解的同学自行百度我们知道ribbon整合restTemplate 只需要 添加一个@LoadBalanced 注解即可如下@Configurationpublic class RestTemplateConfig { @Bean @LoadBalanced ...原创 2019-10-21 23:05:54 · 817 阅读 · 0 评论 -
Ribbon获取注册中心的负载服务端信息
这是获取回来的信息{ "code": 0, "msg": "success", "data": [{ "host": "192.168.10.151", "port": 8081, "scheme": null, "id": "192.168.10.151:8081", "zone": "defaultZone", "readyToServe": true, ...原创 2019-10-21 21:30:38 · 840 阅读 · 0 评论 -
微服务下哪些地方需要做消息幂等处理?
大多数开发过程中没有考虑幂等性问题,但是在微服务下,假如你不考虑幂等性问题,就可能照成非常大的生产问题。当然考虑幂等的时候可以先考虑下某些接口是否需要做幂等处理。非必要接口其实可以不用做。对于一些关键接口还是需要做幂等处理的。以下列举哪些情况需要做幂等处理。1、前端页面重复提交。2、消息队列重复消费。3、负载均衡,多节点的情况可能存在同一请求,发送到了不同节点上。4、超时重试机制,...原创 2019-09-20 11:55:45 · 299 阅读 · 0 评论 -
eureka 手动删除失效的服务
curl -X DELETE "http://192.168.0.248:8761/eureka/apps/USER/192.168.0.100:8080"更多api 可以查看官方api文档原创 2019-08-16 15:05:02 · 2974 阅读 · 0 评论 -
eureka通过命令下线服务
curl -X PUT "http://192.168.0.100:8761/eureka/apps/{Application}/{instanceid}/status?value=DOWN"{Application} 替换为 aplication 名称{instanceid} 替换为 instanceid 假如你设置的是ip 直接就替换为ip 最后结果如下curl -X PUT...原创 2019-08-16 14:53:43 · 2829 阅读 · 0 评论 -
feignclient 文件上传下载的坑
当feignclient 进行文件上传下载的时候需要模拟表单提交,这个时候如果你配置FormEncoder 就会出现其它实体请求就不能用了按如下方式配置就可以了。@Configurationclass MultipartSupportConfig { @Autowired private ObjectFactory<HttpMessageConverters&g...原创 2019-08-16 14:41:56 · 2073 阅读 · 0 评论 -
${spring.cloud.client.ip-address} 变量哪里来的?
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-commons</artifactId> </dependency>2.x版...原创 2019-08-12 14:45:59 · 6992 阅读 · 0 评论 -
微服务架构下得分布式事务解决方案
1、开源解决方案框架名称 GitHub地址 社区开源项目dts https://github.com/venusteam/dts tcc-transaction https://github.com/changmingxie/tcc-transaction Hmily https://github.com/yu199195/hmily ByteTCC ...原创 2019-06-14 10:57:33 · 717 阅读 · 0 评论