刚学习java时,我们编写的程序,运行时只有一个进程,这种程序就是我们常说的“单体架构”,最典型的单体架构图如下:
单体架构的软件,我们可以认为是没有架构的。
软件的架构,从单体架构,发展到垂直多程序架构、分布式架构、soa架构,一路狂奔,到了现在的微服务架构。
虽然我们推崇微服务架构,但客观地说,单体架构依然盛行,包括很多比较大的软件,就是用单体架构来开发的,发布时也只有一个可执行程序。
单体架构之所以盛行,是因为采用其他架构时,我们除了实现业务功能,还要实现架构,例如模块之间的相互调用,这些都很复杂。
当我们使用springcloud开发微服务架构的软件时,会发现事情变得很轻松。我们可以方便地对软件的处理能力扩容,可以用eureka和ribbon,实现模块之间基于restful的相互调用。
说了这么多理论,估计读者都有点烦了,还是直接上代码吧。
在上一讲《java第66讲——微服务之eureka》文章中,详细介绍了如何建立eureka服务器和eureka客户端,大家可以参考,因此这里不再赘述。
我们建立的eureka服务器的信息如下:
模块名称:register监听端口:8800注册url:http://localhost:8800/eureka/
eureka客户端将会启动三个实例,其信息如下:
模块名称:producer监听端口:三个实例监听的端口分别为9901,9902,9903应用名称:rvice-producer
这些信息与《java第66讲——微服务之eureka》文章中实现的代码完全一致。
从名称来看,register是注册中心,producer是生产者,此次开发,将增加一个消费者consumer,获得producer提供的服务:
ribbon是一个用来实现负载均衡的组件。
当我们有多个producer处于运行状态时,consumer可以根据负载情况,获得其中一个producer,然后进行调用。
使用ribbon,我们可以根据系统当前的负载情况,决定增加或者减少producer数量。
通过ribbon,我们轻松地实现了集群的能力。
在producer中增加一个callcontroller类,用于提供服务,该类的代码如下:
package com.flying.producer.controller;import org.springframework.beans.factory.annotation.value;import org.springframework.web.bind.annotation.requestmapping;import org.springframework.web.bind.annotation.requestparam;import org.springframework.web.bind.annotation.restcontroller;@restcontrollerpublic class callcontroller { @value("${rver.port}") private int theport; @requestmapping("/call_me") private string callme(@requestparam(value = "name") string caller){ stringbuffer stringbuffer = new stringbuffer(); stringbuffer.append("rvice of port ").append(theport).append(" is called by ").append(caller); return stringbuffer.tostring(); } }
新增consumer模块的过程如下:
<dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-netflix-eureka-client</artifactid> </dependency> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-ribbon</artifactid> <version>1.4.7.relea</version> </dependency> <dependency> <groupid>org.projectlombok</groupid> 安庆市第一中学<artifactid>lombok</artifactid> <optional>true</optional> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <scope>test</scope> </dependency> </dependencies>
package com.flying.consumer;import org.springframework.boot.springapplication;import org.springframework.boot.autoconfigure.springbootapplication;import org.springframework.cloud.client.discovery.enablediscoveryclient;import org.springframework.cloud.netflix.eureka.enableeurekaclient;@springbootapplication@enableeurekaclient@enablediscoveryclientpublic class consumerapplication { public static void main(string[] args) { springapplication.run(consumerapplication.class, args); }}
package com.flying.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;@configurationpublic class resttemplatecreator { @loadbalanced @bean resttemplate getresttemplate(){ return new resttemplate(); } }
package com.flying.consumer.biz;import org.springframework.beans.factory.annotation.autowired;import org.springframework.stereotype.rvice;import org.springframework.web.client.resttemplate;@rvicepublic class callerrvice { @autowi快乐的一家人red resttemplate resttemplate; public string callproducer(){ return resttemplate.getforobject("http://rvice-producer/call_me?name=consumer", string.class); } }
package com.flying.consumer.controller;import com.flying.consumer.biz.callerrvice;import org.springframework.beans.factory.annotation.autowired;import org.springframework.web.bind.annotation.getmapping;import org.springframework.web.bind.annotation.restcontroller;@restcontrollerpublic class testcontroller { @autowired private callerrvice callerrvice; @getmapping("/call_test") pub珍爱十字绣lic string testbyexplorer(){ 越来越好的英文return callerrvice.callproducer(); } }
rver.port=10000eureka.client.rviceurl.defaultzone=http://localhost:8800/eureka/spring.application.name=rvice-consumer
代码编写完成了,现在准备进行测试。
producer1:监听9901producer2:监听9902producer3:监听9903
这是第一次测试时显示的web页面:
刷新页面,显示的web页面为:
刷新两次页面后,显示了下面的web页面:
不敢想象,没有编写多少代码,借助于spring cloud,竟然轻松地实现了集群功能,实现了负载均衡功能!
本文发布于:2023-04-05 15:25:24,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/85f6a4464c260810be9fe74cebc0f421.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:负载均衡集群如何实现(实现负载均衡集的技巧).doc
本文 PDF 下载地址:负载均衡集群如何实现(实现负载均衡集的技巧).pdf
留言与评论(共有 0 条评论) |