微服务+rabbitmq+mysql 并发下遇到的问题

本文探讨了微服务架构下负载均衡与熔断机制的配置,解决了服务注册失败与负载过大的问题。同时,针对MySQL性能瓶颈,提出了mycat分库方案,并解决了MQ消息堆积问题。最后,分享了微服务集群的硬件需求与优化经验。

一、服务撑不住

在做物联网模块的时候,用到微服务,200个设备5分钟向物联网模块发送数据一次数据,注册中心是单例模式,所有的微服务都开了两个服务,网关会报错,负载过大,服务请求的时候也会报错,提示连接注册中心拒绝,负载过大,连接不到注册中心、服务会失效。

com.sun.jersey.api.client.ClientHandlerException: org.apache.http.NoHttpResponseException: 127.0.0.1:0000failed to respond
    at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:187)
    at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:123)
    at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:27)
    at com.sun.jersey.api.client.Client.handle(Client.java:652)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682)
    at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.put(WebResource.java:529)
    at com.netflix.discovery.shared.transport.jersey.AbstractJerseyEurekaHttpClient.sendHeartBeat(AbstractJerseyEurekaHttpClient.java:102)
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$3.execute(EurekaHttpClientDecorator.java:92)
    at com.netflix.discovery.shared.transport.decorator.MetricsCollectingEurekaHttpClient.execute(MetricsCollectingEurekaHttpClient.java:73)
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.sendHeartBeat(EurekaHttpClientDecorator.java:89)
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$3.execute(EurekaHttpClientDecorator.java:92)
    at com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient.execute(RedirectingEurekaHttpClient.java:89)
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.sendHeartBeat(EurekaHttpClientDecorator.java:89)
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$3.execute(EurekaHttpClientDecorator.java:92)
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:120)
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.sendHeartBeat(EurekaHttpClientDecorator.java:89)
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$3.execute(EurekaHttpClientDecorator.java:92)
    at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.sendHeartBeat(EurekaHttpClientDecorator.java:89)
    at com.netflix.discovery.DiscoveryClient.renew(DiscoveryClient.java:846)
    at com.netflix.discovery.DiscoveryClient$HeartbeatThread.run(DiscoveryClient.java:1399)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.http.NoHttpResponseException: 127.0.0.1:0000failed to respond
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:141)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
    at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:286)
    at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:257)
    at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:230)
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:684)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:486)
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:118)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
    at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:173)
    ... 26 common frames omitted

意思就是 当服务器端由于负载过大等情况发生时,可能会导致在收到请求后无法处理(比如没有足够的线程资源),会直接丢弃链接而不进行处理。此时客户端就回报错:NoHttpResponseException。
官方建议出现这种情况时,可以选择重试。但是重试一定要限制重试次数,避免雪崩。

at com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:483)
    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:184)
    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180)
    at rx.Observable.unsafeSubscribe(Observable.java:10327)
    at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:94)
    at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:42)
    at rx.Observable.unsafeSubscribe(Observable.java:10327)
    at rx.internal.operators.OperatorRetryWithPredicate$SourceSubscriber$1.call(OperatorRetryWithPredicate.java:127)
    at rx.internal.schedulers.TrampolineScheduler$InnerCurrentThreadScheduler.enqueue(TrampolineScheduler.java:73)
    at rx.internal.schedulers.TrampolineScheduler$InnerCurrentThreadScheduler.schedule(TrampolineScheduler.java:52)
    at rx.internal.operators.OperatorRetryWithPredicate$SourceSubscriber.onNext(OperatorRetryWithPredicate.java:79)
    at rx.internal.operators.OperatorRetryWithPredicate$SourceSubscriber.onNext(OperatorRetryWithPredicate.java:45)
    at rx.internal.util.ScalarSynchronousObservable$WeakSingleProducer.request(ScalarSynchronousObservable.java:276)
    at rx.Subscriber.setProducer(Subscriber.java:209)
    at rx.internal.util.ScalarSynchronousObservable$JustOnSubscribe.call(ScalarSynchronousObservable.java:138)
    at rx.internal.util.ScalarSynchronousObservable$JustOnSubscribe.call(ScalarSynchronousObservable.java:129)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
    at rx.Observable.subscribe(Observable.java:10423)
    at rx.Observable.subscribe(Observable.java:10390)
    at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:443)
    at rx.observables.BlockingObservable.single(BlockingObservable.java:340)
    at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:112)
    at org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient.execute(LoadBalancerFeignClient.java:63)

二、mysql 性能瓶颈

单表数据表数据量大概达到125000条的时候,mysql 性能达到瓶颈,读写IO达到百分之九十九到一百,写入极慢,导致数据堆在mq 里几万条。

三、mq 消费不及时导致消息堆积

因为mysql 性能的问题,出现了mq 消息堆积问题,如果消费速度小于消息产生速度,不断产生消息堆积,该如何解决?

四,总结

注册拒绝、负载过大的情况我的解决方案是搭建微服务集群,通过开多个服务来负载均衡,数据库瓶颈的问题采用mycat分库,做一个负载均衡,缓解数据库压力,mq消息堆积问题采用mq 集群来解决。此时会产生新的问题,微服务集群对服务器性能要求,开多个服务后,因为耗内存,会出现服务起不起来的情况,8核32G服务器,同时开15个服务,包含redis、mq、mysql等应用,会有一两个起不起来,硬件方面需要一定的配置。内存加到64G后,同时开17个服务,目前没有问题。mycat分四个库,根据分片字段存储查询,mysql读写性能还好。

五、其他

ribbon+hystrix实现负载均衡和熔断的时候,ribbon的超时时间应该小于hystrix超时时间,如果大于,那么ribbon的负载将失去意义,hystrix的超时时间一到就会立马熔断,ribbon将无法重连,配置如下:

hystrix:
  command:
    default:
      execution:
        isolation:
          strategy: SEMAPHORE
          thread:
            timeoutInMilliseconds: 130000
          semaphore:
            maxConcurrentRequests: 1000 
#        circuitBreaker:
#          sleepWindowInMilliseconds:  5000
ribbon:
  ReadTimeout: 30000
  ConnectTimeout: 30000
  MaxAutoRetries: 1
  MaxAutoRetriesNextServer: 1

ribbon、hystrix、zuul 超时时间详细配置及计算后期整理再发。。。

<think>首先,用户的问题是:“我想了解Java微服务与Vue结合的相关内容,可能包括结合的方法、案例、开发实践等 请问Java微服务与Vue结合的开发方法、案例及实践”。参考了之前的系统级指令,我需要遵循规则: 1. **行内数学表达式**:必须用 `$...$` 格式。但在这个主题中,可能没有数学表达式,所以我可以忽略这一点,除非有相关公式。 2. **独立公式**:必须用 `$$...$$` 单独成段。同上,可能不需要。 3. **LaTeX语法正确**:如果需要公式,确保正确。 4. **使用中文回答**:整个回答必须是中文。 5. **生成相关问题**:在回答后生成相关问题。 6. **引用标识**:在引用的段落末尾自然地添加引用标识,格式如 `[^1]`。用户提供了引用 [1] 到 [4],我需要参考它们,但用户说“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答”。用户上一次的问题是关于这个问题本身,所以我应该基于这些引用和主题来回答。 现在,分析用户提供的引用: - 引用 [1]:基于Java+SpringBoot+vue+elementui药品商城采购系统。涉及Java后端和Vue前端。 - 引用 [2]:微服务开发,使用Spring Cloud、Vue3等。提到SSM、Spring Boot、MyBatis、MySQL、Redis等。 - 引用 [3]:Java毕设项目社区微服务平台小程序服务器端,使用Java、Vue、Mybatis、MySQL等。 - 引用 [4]:基于微服务、Java、Springcloud、Vue、MySQL开发的智慧工地管理系统。 所有这些引用都指向Java微服务后端(使用Spring Boot、Spring Cloud)与Vue前端结合的开发实践。 用户的问题是关于Java微服务与Vue结合的方法、案例和开发实践。 结构我的回答: - **回答结构**:系统指令说“回答结构清晰,帮助用户逐步解决问题”。所以,我需要组织回答为清晰的步骤或部分。 可能的提纲: 1. **介绍**:简要解释Java微服务与Vue结合的背景和优势。 2. **结合方法**:描述如何将它们结合,包括技术栈、架构设计。 3. **案例**:基于引用,分享具体案例。 4. **开发实践**:讨论最佳实践、工具、配置。 5. **结论**:总结关键点。 然后,**生成相关问题**:在结束前,添加“§§相关问题§§”类似示例,列出几个相关问题。 确保引用:在回答中自然地引用提供的引用。例如,当提到案例时,参考引用 [1]、[3]、[4] 等。 关键点从引用中提取: - 后端技术:Java、Spring Boot、Spring Cloud、MyBatis、MySQL、Redis。 - 前端技术:Vue.js(可能有Element UI或其他框架)。 - 开发流程:如使用Maven、运行Spring Boot应用、配置数据库。 开发方法: - 微服务架构:后端拆分成独立的服务,使用Spring Cloud进行治理。 - 前后端分离:Vue作为前端框架,通过API与后端交互。 - 工具:IDEA/Eclipse、Navicat、Maven等。 案例: - 药品商城采购系统 [^1] - 社区微服务平台小程序 [^3] - 智慧工地管理系统 [^4] 开发实践: - 数据库配置:导入SQL文件,修改application.yml。 - 管理员账号设置。 - 运行后端应用。 使用中文回答。 生成相关问题:类似于示例,列出3-4个问题。 最终回答结构: - 开头介绍。 - 主体部分分点讨论方法、案例、实践。 - 结束生成相关问题。 </think>### Java微服务与Vue结合的方法、案例及实践 在现代Web开发中,Java微服务架构与Vue.js前端框架的结合是一种常见且高效的模式。这种模式利用了Java后端的稳定性和微服务的可伸缩性,结合Vue的前端响应式特性,实现前后端分离的开发。下面我将从**结合方法**、**案例分析**和**开发实践**三个方面,逐步为您详细解释。内容基于您提供的引用案例(如药品商城、智慧工地管理系统等),并结合行业最佳实践。 #### 1. **Java微服务与Vue的结合方法** Java微服务通常使用Spring Boot和Spring Cloud框架构建,后端提供RESTful API;Vue.js作为前端框架,通过HTTP请求与这些API交互。结合的核心在于**前后端分离架构**: - **技术栈概述**: - **后端**:Java + Spring Boot(快速搭建微服务+ Spring Cloud(服务治理,如服务注册、配置中心)+ MyBatis/MyBatis-Plus(持久层)+ MySQL(数据库)+ Redis(缓存)[^2][^3]。 - **前端**:Vue.js(核心框架)+ Vue Router(路由)+ Vuex(状态管理)+ Axios(HTTP客户端)+ Element UI(UI组件库,常用于企业级应用)[^1][^4]。 - **交互方式**:前端Vue发送AJAX请求(如使用Axios)到后端API,数据格式一般为JSON。后端微服务处理业务逻辑,返回响应数据。 - **关键结合步骤**: 1. **定义API接口**:后端团队先设计RESTful API(例如使用Spring Doc生成文档),如`/api/users`获取用户数据。这确保前后端并行开发[^2]。 2. **前端调用API**:Vue组件中使用Axios调用后端API。例如: ```javascript // Vue组件中调用药品商城的用户API axios.get('http://localhost:8080/api/users') .then(response => { this.users = response.data; // 处理返回数据 }) .catch(error => { console.error('API错误:', error); }); ``` 3. **跨域处理**:开发中需解决跨域问题。后端Spring Boot通过`@CrossOrigin`注解或配置CORS过滤器,允许前端Vue应用访问API[^3]。 4. **服务治理**:使用Spring Cloud的Eureka或Consul进行服务注册与发现,确保前端动态连接到正确的微服务实例[^2][^4]。 这种方法的优势包括:**高内聚低耦合**(前后端独立开发)、**易扩展**(微服务可横向扩展)、**高效开发**(Vue的组件化减少重复代码)。引用中的药品商城系统正是基于此模式构建,后端用Spring Boot处理采购逻辑,前端Vue实现用户界面[^1]。 #### 2. **案例分析** 基于您提供的引用,以下是三个典型案例,展示了Java微服务与Vue结合的实际应用: - **药品商城采购系统**: - **描述**:该系统使用Java Spring Boot构建后端微服务,处理药品订单、库存管理;前端Vue.js + Element UI实现响应式用户界面。管理员可通过前端界面管理采购流程,后端API提供数据支持。 - **技术细节**:后端采用MyBatis操作MySQL数据库,Redis缓存高频数据;前端Vue路由管理多页面,Axios调用API。开发中,团队先定义API文档(如使用Spring Doc),确保前后端协作无缝[^1]。 - **成果**:提升了系统性能,支持高并发采购请求,前端加载速度快。 - **社区微服务平台小程序**: - **描述**:这是一个毕设项目,后端基于Java Spring Boot微服务,提供社区服务API(如用户管理、活动发布);前端Vue构建小程序界面(可集成微信小程序)。 - **技术细节**:后端使用Maven管理依赖,application.yml配置数据库连接;前端Vue实现动态渲染。管理员账号(如`abo:abo`)用于测试,运行`SpringbootSchemaApplication.java`启动后端。案例中强调了前后端分离的部署:后端运行在8080端口,前端独立部署[^3]。 - **成果**:简化了社区服务流程,降低了维护成本。 - **智慧工地管理系统**: - **描述**:结合微服务架构(Spring Cloud)和Vue前端,实现工地人员、设备、材料的数字化管理。后端微服务处理实时数据(如传感器信息),前端Vue可视化展示。 - **技术细节**:使用Spring Cloud集成多个子系统(如设备监控模块),Vue前端通过WebSocket实现实时更新。引用中强调“数据统一接入与共享”,前端调用API获取数据后,利用Vuex管理状态[^4]。 - **成果**:提高了工地管理效率,支持远程调度和数据协同。 这些案例的共同点是:**前端Vue负责UI和用户交互,后端Java微服务提供数据处理能力**;引用显示,这种方法在电商、社区服务、工业管理等领域广泛应用[^1][^3][^4]。 #### 3. **开发实践** 在实际开发中,Java微服务与Vue的结合需要遵循标准化流程。以下是关键实践点,基于引用中的经验: - **开发环境搭建**: - **工具链**:IDE推荐IntelliJ IDEA或Eclipse后端开发;前端用VS Code或WebStorm。数据库工具如Navicat管理MySQL[^3]。 - **初始化项目**:后端使用Spring Initializr生成Spring Boot项目(集成Spring Cloud依赖);前端用Vue CLI创建Vue项目(如`vue create my-app`)。 - **配置管理**:后端在`application.yml`中设置数据库连接、端口等;前端配置环境变量(如`.env`文件)定义API基础URL[^3]。 - **最佳实践**: - **API设计先行**:先定义Swagger或Spring Doc文档,后端团队开发API时,前端团队可Mock数据开始编码。这减少了集成风险[^2]。 - **错误处理与安全**:后端使用Spring Security实现认证(如JWT令牌),Vue前端拦截错误响应;引用中的智慧工地系统通过统一异常处理提高健壮性[^4]。 - **性能优化**:后端用Redis缓存查询结果(如高频API),前端Vue懒加载组件提升加载速度。引用案例显示,药品商城系统通过Redis缓存降低了数据库压力[^1][^2]。 - **测试与部署**: - 单元测试:后端JUnit测试微服务逻辑;前端Jest测试Vue组件。 - 部署:后端打包为JAR文件运行(如`java -jar app.jar`);前端构建成静态文件(`npm run build`)部署到Nginx。智慧工地系统采用了Docker容器化部署以提高伸缩性[^4]。 - **常见挑战与解决方案**: - **跨域问题**:开发阶段,后端添加`@CrossOrigin(origins = "*")`;生产环境用Nginx反向代理。 - **数据一致性**:微服务间使用Spring Cloud Stream或消息队列(如RabbitMQ)同步数据。 - **团队协作**:采用敏捷开发,前后端团队同步API变更。引用中的社区微服务平台项目通过Maven和Git管理代码依赖[^3]。 总之,Java微服务与Vue的结合方法强调前后端分离,案例如药品商城和智慧工地展示了其实际价值,开发实践中需关注API设计、性能优化和安全。这能显著提升系统可维护性和用户体验[^1][^2][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值