一种互联网应用的分布式架构模式微服务应用框架的实现(gradle,dubbo,zookeeper,springmmvc)

一种互联网应用的分布式架构模式微服务应用框架的实现(gradle,dubbo,zookeeper,springmmvc)  

简介: 

框架是用freemarker、springmvc、dubbo、hibernate编写的快速互联网应用敏捷开发框架,采用web层和service层分离独立的设计模式, 

用最流行的微服务架构,使用gradle替代maven管理项目结构依赖 


架构应用图: 


主要分5部分组成: 

fw_core:核心微层服务基类 
fw_web:前端web框架使用 
fw_facade:api层记录 
fw_string:字符串处理 
fw_cg:代码生成工具 

此项目已经放到github上,由于时间有限,开档不全! 

希望各位大神有好的建议,联系我一起交流! 

源码地址:https://github.com/ligson/hfw (技术交流扣扣群:450794233)

微服务架构的好处
  微 服务架构模式有很多好处。首先,通过分解巨大单体式应用为多个服务方法解决了复杂性问题。在功能不变的情况下,应用被分解为多个可管理的分支 或服务。每个服务都有一个用RPC-或者消息驱动API定义清楚的边界。微服务架构模式给采用单体式编码方式很难实现的功能提供了模块化的解决方案,由 此,单个服务很容易开发、理解和维护。
  第 二,这种架构使得每个服务都可以有专门开发团队来开发。开发者可以自由选择开发技术,提供API服务。当然,许多公司试图避免混乱,只提供某 些技术选择。然后,这种自由意味着开发者不需要被迫使用某项目开始时采用的过时技术,他们可以选择现在的技术。甚至于,因为服务都是相对简单,即使用现在 技术重写以前代码也不是很困难的事情。
  第三,微服务架构模式是每个微服务独立的部署。开发者不再需要协调其它服务部署对本服务的影响。这种改变可以加快部署速度。UI团队可以采用AB测试,快速的部署变化。微服务架构模式使得持续化部署成为可能。
  最 后,微服务架构模式使得每个服务独立扩展。你可以根据每个服务的规模来部署满足需求的规模。甚至于,你可以使用更适合于服务资源需求的硬件。 比如,你可以在EC2 Compute Optimized instances上部署CPU敏感的服务,而在EC2 memory-optimized instances上部署内存数据库。
微服务架构的不足
   Fred Brooks在30Year前写道,“there are no silver bullets”,像任何其它科技一样,微服务架构也有不足。其中一个跟他的名字类似,『微服务』强调了服务大小,实际上,有一些开发者鼓吹建立稍微大一 些的,10-100 LOC服务组。尽管小服务更乐于被采用,但是不要忘了这只是终端的选择而不是最终的目的。微服务的目的是有效的拆分应用,实现敏捷开发和部署。
  另 外一个主要的不足是,微服务应用是分布式系统,由此会带来固有的复杂性。开发者需要在RPC或者消息传递之间选择并完成进程间通讯机制。更甚 于,他们必须写代码来处理消息传递中速度过慢或者不可用等局部失效问题。当然这并不是什么难事,但相对于单体式应用中通过语言层级的方法或者进程调用,微 服务下这种技术显得更复杂一些。
  另 外一个关于微服务的挑战来自于分区的数据库架构。商业交易中同时给多个业务分主体更新消息很普遍。这种交易对于单体式应用来说很容易,因为只 有一个数据库。在微服务架构应用中,需要更新不同服务所使用的不同的数据库。使用分布式交易并不一定是好的选择,不仅仅是因为CAP理论,还因为今天高扩 展性的NoSQL数据库和消息传递中间件并不支持这一需求。最终你不得不使用一个最终一致性的方法,从而对开发者提出了更高的要求和挑战。
  测 试一个基于微服务架构的应用也是很复杂的任务。比如,采用流行的Spring Boot架构,对一个单体式web应用,测试它的REST API,是很容易的事情。反过来,同样的服务测试需要启动和它有关的所有服务(至少需要这些服务的stubs)。再重申一次,不能低估了采用微服务架构带 来的复杂性。
  另 外一个挑战在于,微服务架构模式应用的改变将会波及多个服务。比如,假设你在完成一个案例,需要修改服务A、B、C,而A依赖B,B依赖C。 在单体式应用中,你只需要改变相关模块,整合变化,部署就好了。对比之下,微服务架构模式就需要考虑相关改变对不同服务的影响。比如,你需要更新服务C, 然后是B,最后才是A,幸运的是,许多改变一般只影响一个服务,而需要协调多服务的改变很少。
  部署一个微服务应用也很复杂,一个分布式应用只需要简单在复杂均衡器后面部署各自的服务器就好了。每个应用实例是需要配置诸如数据库和消息中间件等基础服务。相对比,一个微服务应用一般由大批服务构成。例如,根据Adrian Cockcroft,NetFlix 有大约600个服务。每个服务都有多个实例。这就造成许多需要配置、部署、扩展和监控的部分,除此之外,你还需要完成一个服务发现机制(后续文章中发 表),以用来发现与它通讯服务的地址(包括服务器地址和端口)。传统的解决问题办法不能用于解决这么复杂的问题。接续而来,成功部署一个微服务应用需要开 发者有足够的控制部署方法,并高度自动化。
  一种自动化方法是使用PaaS服务,例如Cloud Foundry。 PaaS给开发者提供一个部署和管理微服务的简单方法,它把所有这些问题都打包内置解决了。同时,配置PaaS的系统和网络专家可以采用最佳实践和策略来 简化这些问题。另外一个自动部署微服务应用的方法是开发对于你来说最基础的PaaS系统。一个典型的开始点是使用一个集群化方案,比如配合Docker使 用Mesos或者Kubernetes


为什么采用gradle管理而不是maven

第一,引用依赖方面变得非常简洁。

第二,Maven和Gradle对依赖项的scope有所不同。在Maven世界中,一个依赖项有6种scope,分别是complie(默认)、provided、runtime、test、system、import。而grade将其简化为了4种,compile、runtime、testCompile、testRuntime。那么如果想在gradle使用类似于provided的scope怎么办?别着急,由于gradle语言的强大表现力,我们可以轻松编写代码来实现类似于provided scope的概念(例如How to use provided scope for jar file in Gradle build?)。

第三 ,Gradle支持动态的版本依赖。在版本号后面使用+号的方式可以实现动态的版本管理。

第四,在解决依赖冲突方面Gradle的实现机制更加明确。使用Maven和Gradle进行依赖管理时都采用的是传递性依赖;而如果多个依赖项指向同一个依赖项的不同版本时就会引起依赖冲突。而Maven处理这种依赖关系往往是噩梦一般的存在。而Gradle在解决依赖冲突方面相对来说比较明确。


集群、分布式、负载均衡概念的不同

1、Linux集群主要分成三大类( 高可用集群, 负载均衡集群,科学计算集群)(下面只介绍负载均衡集群) 
负载均衡集群(Load Balance Cluster) 
负载均衡系统:集群中所有的节点都处于活动状态,它们分摊系统的工作负载。一般Web服务器集群、数据库集群和应用服务器集群都属于这种类型。 

负载均衡集群一般用于相应网络请求的网页服务器,数据库服务器。这种集群可以在接到请求时,检查接受请求较少,不繁忙的服务器,并把请求转到这些服务器上。从检查其他服务器状态这一点上看,负载均衡和容错集群很接近,不同之处是数量上更多。 


2、负载均衡系统: 负载均衡又有DNS负载均衡(比较常用)、IP负载均衡、反向代理负载均衡等,也就是在集群中有服务器A、B、C,它们都是互不影响,互不相干的,任何一台的机器宕了,都不会影响其他机器的运行,当用户来一个请求,有负载均衡器的算法决定由哪台机器来处理,假如你的算法是采用round算法,有用户a、b、c,那么分别由服务器A、B、C来处理; 


3、分布式是指将不同的业务分布在不同的地方。 
而集群指的是将几台服务器集中在一起,实现同一业务。 
分布式中的每一个节点,都可以做集群。 
而集群并不一定就是分布式的。 
举例:就比如新浪网,访问的人多了,他可以做一个群集,前面放一个响应服务器,后面几台服务器完成同一业务,如果有业务访问的时候,响应服务器看哪台服务器的负载不是很重,就将给哪一台去完成。 
而分布式,从窄意上理解,也跟集群差不多, 但是它的组织比较松散,不像集群,有一个组织性,一台服务器垮了,其它的服务器可以顶上来。 
分布式的每一个节点,都完成不同的业务,一个节点垮了,哪这个业务就不可访问了。


### 回答1: 如果你想在微服务系统中使用 Dubbo,你需要做以下几步: 1. 将 Dubbo 的依赖添加到你的项目中。这可以通过使用 Maven 或者 Gradle实现,具体方法可以参考 Dubbo 的文档。 2. 在你的服务提供者中实现 Dubbo 服务接口。这一步需要你编写 Java 代码来实现 Dubbo 服务接口中定义的方法。 3. 在服务提供者的配置文件中配置 Dubbo 服务。这一步需要你编写一个 XML 文件或者使用注解的方式来配置 Dubbo 服务。 4. 在服务消费者中调用 Dubbo 服务。这一步需要你编写 Java 代码来调用 Dubbo 服务。 希望这些步骤能帮助你接入和调用 Dubbo 服务。 ### 回答2: 在微服务系统中接入Dubbo并进行调用主要分为以下几个步骤: 1. 引入Dubbo依赖:在项目的pom.xml文件中添加Dubbo的依赖,例如: ```xml <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.8</version> </dependency> ``` 2. 配置Dubbo相关信息:在项目的application.properties(或application.yaml)文件中添加Dubbo的配置信息,如注册中心地址、端口号、协议等,例如: ```properties dubbo.application.name=your-application-name dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.protocol.port=20880 ``` 3. 编写服务接口:定义需要暴露给其他服务调用的服务接口,如: ```java public interface UserService { User getUserById(Long id); } ``` 4. 实现服务接口:编写具体的服务实现类,并在类上使用@org.apache.dubbo.config.annotation.Service注解将其暴露为Dubbo服务,例如: ```java @org.apache.dubbo.config.annotation.Service public class UserServiceImpl implements UserService { @Override public User getUserById(Long id) { // 实现具体的业务逻辑 } } ``` 5. 调用Dubbo服务:在需要调用Dubbo服务的地方注入服务接口,通过调用接口方法来实现服务调用,例如: ```java @RestController public class UserController { @Reference private UserService userService; @GetMapping("/user/{id}") public User getUser(@PathVariable Long id) { return userService.getUserById(id); } } ``` 通过以上步骤,我们就可以在微服务系统中接入Dubbo并进行服务的调用。当接入多个服务时,可以通过Dubbo的集群容错、负载均衡等特性来提高系统的稳定性和性能。 ### 回答3: 在微服务系统中接入Dubbo并调用可以按照以下步骤进行: 1. 引入Dubbo依赖:在微服务项目的pom.xml文件中添加Dubbo依赖,如: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.7.12</version> </dependency> ``` 2. 配置Dubbo服务提供者:在需要提供服务的微服务中,通过配置文件或注解配置Dubbo的服务提供者信息,包括服务接口、服务实现和暴露的端口等信息。 ```java @Service public class UserServiceImpl implements UserService { @Override public User getUserById(String userId) { // Service implementation logic here } } // 配置Dubbo服务提供者 <dubbo:service interface="com.example.UserService" ref="userServiceImpl" timeout="5000" retries="3" version="1.0.0"/> ``` 3. 配置Dubbo服务消费者:在需要调用Dubbo服务的微服务中,通过配置文件或注解配置Dubbo的服务消费者信息,包括服务接口、版本号和负载均衡策略等信息。 ```java // 配置Dubbo服务消费者 <dubbo:reference id="userService" interface="com.example.UserService" url="dubbo://localhost:12345" version="1.0.0" loadbalance="roundrobin"/> ``` 4. 调用Dubbo服务:在需要调用Dubbo服务的地方,通过Dubbo的服务引用对象进行调用,如: ```java @Autowired private UserService userService; public void doSomething() { User user = userService.getUserById("123456"); // Handle the user data returned from the Dubbo service } ``` 通过以上步骤,我们就可以在微服务系统中接入Dubbo并调用了。需要注意的是,Dubbo还支持更多的配置和扩展,可以根据具体的需求进行相应的配置和调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值