dubbo服务框架(基础篇)
- 格式:pptx
- 大小:2.02 MB
- 文档页数:14
SOA服务化架构1.1.传统架构传统架构图存在的问题:1、功能耦合度高2、系统维护成本高3、如果并发量大,无法解决高并发的问题体统架构负载均衡传统架构负载均衡图存在的问题:1、系统无法有效进行水平扩展(集群不能针对功能模块)2、用户存在重复登录的问题,需要session共享来解决,是以session广播的形式,比较消耗资源,宽带如果要达到10000并发需要20台服务器做tomcat集群。
当tomcat集群中节点数量增加,服务能力先增加后下降。
3、所以集群中节点数量不能太多,一般也就5个左右。
1.2.分布式架构分布式架构图集群:相当于同一个工程代码拷贝多份部署到多台服务器,每台服务器单独独立部署运行。
分布式架构:把系统按照模块拆分成多个子系统;多个子系统相互协作才能完成业务流程系统之间需要进行通信。
优点:1、把模块拆分,使用接口通信,降低模块之间的耦合度。
2、把项目拆分成若干个子项目,不同的团队负责不同的子项目。
3、增加功能时只需要再增加一个子项目,调用其他系统的接口就可以。
4、可以灵活的进行分布式部署。
缺点:1、系统之间交互需要使用远程通信,需要开发接口,增加工作量。
2、各个模块有一些通用的业务逻辑无法公用。
1.3.基于SOA架构SOA:Service Oriented Architecture面向服务的架构。
也就是把工程都拆分成服务层工程、表现层工程。
服务层中包含业务逻辑,只需要对外提供服务即可。
表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。
工程都可以独立部署。
SOA机构图1.4.L ESSO基于SOA架构架构说明:整个架构基于Spring、SpringMVC、MyBatis、RESful分布式敏捷开发系统架构,提供整套公共的微服务模块:日志分析、配置中心、文件服务、内容服务、消息服务等。
业务系统根据自身的业务需要进行开发服务API并结合公共服务进行拓展。
建立统一的权限管理服务(UPMS)确保入口统一。
Configuration ReferenceConfiguration Relation:SLA配置在此完成!Service Layer Agreement∙ApplicationConfig 应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。
∙RegistryConfig 注册中心配置,用于配置连接注册中心相关信息。
∙ProtocolConfig 协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。
∙ServiceConfig 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。
∙ProviderConfig 提供方的缺省值,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值。
∙ReferenceConfig 引用配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。
∙ConsumerConfig 消费方缺省配置,当ReferenceConfig某属性没有配置时,采用此缺省值。
∙MethodConfig 方法配置,用于ServiceConfig和ReferenceConfig指定方法级的配置信息。
∙ArgumentConfig 用于指定方法参数配置。
Configuration Override:∙上图中以timeout为例,显示了配置的查找顺序,其它retries, loadbalance, actives等类似。
∙方法级优先,接口级次之,全局配置再次之。
∙如果级别一样,则消费方优先,提供方次之。
∙其中,服务提供方配置,通过URL经由注册中心传递给消费方。
∙建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。
∙理论上ReferenceConfig的非服务标识配置,在ConsumerConfig,ServiceConfig, ProviderConfig均可以缺省配置。
Dubbo框架的使用操作文档目录1ZooKeeper的配置安装.......................................... 错误!未定义书签。
1.1 Z OO K EEPER简介 ................................................................ 错误!未定义书签。
1.2 详细安装文档说明参考.................................................... 错误!未定义书签。
2Dubbo-admin配置安装 ........................................ 错误!未定义书签。
2.1 管理平台的简介................................................................. 错误!未定义书签。
2.2 详细安装文档的参考 ........................................................ 错误!未定义书签。
3创建使用Dubbo框架的Maven项目 ..................... 错误!未定义书签。
3.1 创建Maven项目SINOEP-INTERFACE-USER................... 错误!未定义书签。
3.1.1 创建实体类 ................................................................. 错误!未定义书签。
3.1.2 创建接口...................................................................... 错误!未定义书签。
3.1.3 在Pom.xml文件中引入依赖的包 ......................... 错误!未定义书签。
Dubbo框架面试题Dubbo框架是当前Java开发中广泛使用的一种分布式服务框架。
在面试中,经常会涉及到与Dubbo相关的技术问题。
本文将就一些常见的Dubbo框架面试题进行解答,帮助读者更好地理解Dubbo框架的原理和使用。
一、Dubbo框架概述Dubbo是一个分布式服务框架,提供了高性能的远程调用和负载均衡功能。
它采用了基于接口的远程调用方式,将服务拆分为多个小的服务单元,通过网络进行通信。
Dubbo具有一定的可扩展性和高可用性,并且提供了完善的监控和治理功能。
二、Dubbo框架的原理1. 服务注册与发现在Dubbo框架中,服务提供者将自身提供的服务注册到注册中心,而服务消费者从注册中心获取到服务提供者的地址,实现服务的发现。
Dubbo支持多种注册中心,如ZooKeeper、Consul等。
2. 远程调用Dubbo框架通过RPC(远程过程调用)实现服务之间的远程调用。
在服务消费者和服务提供者之间建立连接后,通过通信协议进行数据的传输。
Dubbo支持多种通信协议,如Dubbo协议、HTTP等。
3. 负载均衡Dubbo框架提供了多种负载均衡策略,如轮询、随机、一致性哈希等。
通过负载均衡策略,Dubbo可以将请求均匀地分摊到各个服务提供者上,提高系统的并发处理能力。
三、Dubbo框架的核心组件1. 服务提供者(Provider)服务提供者是提供具体服务的一方,将自己提供的服务注册到注册中心,并响应服务消费者的请求。
服务提供者需要实现服务接口,并配置好相应的Dubbo配置文件。
2. 服务消费者(Consumer)服务消费者是使用服务的一方,通过注册中心获取到服务提供者的地址,并发起远程调用请求。
服务消费者需要引入服务接口的定义,并配置好Dubbo相关的配置文件。
3. 注册中心(Registry)注册中心负责服务的注册与发现。
Dubbo框架支持多种注册中心,如ZooKeeper、Consul等。
注册中心需要保证高可用性,并提供相应的监控和治理功能。
Dubbo服务的开发流程Dubbo是一个分布式服务框架,可以帮助我们快速构建高性能、可扩展的分布式应用。
在开发Dubbo服务时,需要按照以下步骤和流程进行。
1. 环境准备在开始开发Dubbo服务之前,需要进行一些环境准备工作。
1.1 安装JDK首先需要安装Java Development Kit (JDK),确保你的电脑上已经安装了合适的JDK版本,并配置好了环境变量。
1.2 下载Dubbo从Dubbo官网()下载最新版本的Dubbo,并解压到本地目录中。
1.3 创建Maven项目使用Maven创建一个新的Java项目,作为你的Dubbo服务的开发工程。
可以使用命令行或者IDE来完成这个步骤。
2. 定义接口在Dubbo中,服务提供者和消费者之间通过接口进行通信。
所以第一步是定义接口。
2.1 创建API模块在Maven项目中创建一个新的Module(如:my-api),用于存放接口定义和实体类等公共代码。
这个模块将被提供者和消费者共同引用。
2.2 定义接口在API模块中创建一个Java接口,用于定义服务的方法。
例如,我们可以创建一个UserService接口,其中包含一些用户相关的方法。
package com.example.api;public interface UserService {User getUserById(int id);List<User> getAllUsers();void addUser(User user);}3. 编写服务提供者在Dubbo中,服务提供者是实际提供服务的一方。
3.1 创建Provider模块在Maven项目中创建一个新的Module(如:my-provider),用于实现服务提供者相关代码。
3.2 引入依赖在Provider模块的pom.xml文件中,引入Dubbo和API模块的依赖。
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.version}</version></dependency><dependency><groupId>com.example</groupId><artifactId>my-api</artifactId><version>${project.version}</version></dependency>3.3 配置Dubbo在Provider模块中创建一个名为dubbo.properties(或dubbo.yml)的配置文件,并配置Dubbo相关属性。
分布式服务框架dubbodubbox⼊门⽰例dubbo是⼀个分布式的服务架构,可直接⽤于⽣产环境作为SOA服务框架。
淘宝将这个项⽬开源出来以后,得到了不少同⾏的⽀持,包括:不管如何,能在阿⾥、当当、京东这些⼤型⽹站正式使⽤的框架,总不⾄于差到哪⾥去。
本⽂下⾯的⽰例均基于当当的dubbox版本,由于dubbox并没向maven提交编译后的jar包,所以只能从github clone代码到本地编译得到jar 包。
编译及测试步骤:(以下步骤全在windows环境中完成)1.本机先安装github on Windows的客户端,将在path路径中,把git.exe加进去3. mvn install -Dmaven.test.skip=true 跳过测试编译4.在本机,参考zoo.cfg如下:tickTime=2000initLimit=10syncLimit=5dataDir=D:/java/zookeeper-3.4.6/datadataLogDir=D:/java/zookeeper-3.4.6/logclientPort=2181server.1=localhost:2287:3387然后输⼊ bin/zkServer.cmd 启⽤zookeeper5. intellij Idea中导⼊源码6.运⾏ \dubbox\dubbo-demo\dubbo-demo-provider\src\test\java\com\alibaba\dubbo\demo\provider\DemoProvider.java把服务提供⽅跑起来,成功后,可以在ZK⾥,⽤ ls / 看下,会发现zk⾥多出了⼀个dubbo的节点,所有服务全注册在这⾥了7.运⾏\dubbox\dubbo-demo\dubbo-demo-consumer\src\test\java\com\alibaba\dubbo\demo\consumer\DemoConsumer.java服务消费⽅调⽤测试,可以看console⾥的输出8.运⾏\dubbox\dubbo-demo\dubbo-demo-consumer\src\test\java\com\alibaba\dubbo\demo\consumer\RestClient.java跑⼀下rest调⽤dubbox官⽅的⽰例,虽然已经很简单了,但是对于初次接触的⼈来讲,仍然略显复杂,下⾯的代码在其基础上简化了⼀下:⼀、先定义服务接⼝及传输对象DTO项⽬结构如下代码:User.javapackage yjmyzz.dubbo.demo.api;import org.codehaus.jackson.annotate.JsonProperty;import javax.validation.constraints.Min;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;import java.io.Serializable;@XmlRootElement@XmlAccessorType(XmlAccessType.FIELD)public class User implements Serializable {@NotNull@Min(1L)private Long id;@JsonProperty("username")@XmlElement(name = "username")@NotNull@Size(min = 6, max = 50)private String name;public User() {}public User(Long id, String name) {this.id = id; = name;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}@Overridepublic String toString() {return "User (" +"id=" + id +", name='" + name + '\'' +')';}}UserService.javapackage yjmyzz.dubbo.demo.api;public interface UserService {User getUser(Long id);}UserRestService.javapackage yjmyzz.dubbo.demo.api;import javax.validation.constraints.Min;public interface UserRestService {User getUser(@Min(value = 1L, message = "User ID must be greater than 1") Long id);}pom.xml1<?xml version="1.0" encoding="UTF-8"?>2<project xmlns="/POM/4.0.0"3 xmlns:xsi="/2001/XMLSchema-instance"4 xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"> 56<modelVersion>4.0.0</modelVersion>78<groupId>blogs.yjmyzz</groupId>9<artifactId>dubbo-hello-api</artifactId>10<version>0.1</version>1112<dependencies>1314<dependency>15<groupId>com.alibaba</groupId>16<artifactId>dubbo</artifactId>17<version>2.8.4</version>18</dependency>1920<dependency>21<groupId>javax.validation</groupId>22<artifactId>validation-api</artifactId>23<version>1.0.0.GA</version>24</dependency>2526<dependency>27<groupId>javax.annotation</groupId>28<artifactId>javax.annotation-api</artifactId>29<version>1.2</version>30</dependency>3132<dependency>33<groupId>org.codehaus.jackson</groupId>34<artifactId>jackson-mapper-asl</artifactId>35<version>1.9.12</version>36</dependency>3738</dependencies>39</project>View Code⼆、定义服务⽣产者(即:服务接⼝的实现⽅)UserServiceImpl.javapackage yjmyzz.dubbo.demo.provider;import er;import erService;public class UserServiceImpl implements UserService {public User getUser(Long id) {return new User(id, "username" + id);}}UserRestServiceImpl.javapackage yjmyzz.dubbo.demo.provider;import com.alibaba.dubbo.rpc.RpcContext;import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;import er;import erRestService;import erService;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.ws.rs.*;import javax.ws.rs.core.MediaType;@Path("users")@Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})@Produces({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})public class UserRestServiceImpl implements UserRestService {private UserService userService;public void setUserService(UserService userService) {erService = userService;}@GET@Path("{id : \\d+}")public User getUser(@PathParam("id") Long id) {if (RpcContext.getContext().getRequest(HttpServletRequest.class) != null) {System.out.println("Client IP address from RpcContext: " + RpcContext.getContext().getRequest(HttpServletRequest.class).getRemoteAddr()); }if (RpcContext.getContext().getResponse(HttpServletResponse.class) != null) {System.out.println("Response object from RpcContext: " + RpcContext.getContext().getResponse(HttpServletResponse.class));}return userService.getUser(id);}}DemoProvider.javapackage yjmyzz.dubbo.demo.provider;import org.springframework.context.support.ClassPathXmlApplicationContext;import java.io.IOException;public class DemoProvider {public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:META-INF/spring/*.xml");context.start();System.out.println("服务已经启动...");System.in.read();}}配置⽂件:resources\META-INF\spring\dubbo-demo-provider.xml1<?xml version="1.0" encoding="UTF-8"?>23<beans xmlns="/schema/beans"4 xmlns:xsi="/2001/XMLSchema-instance"5 xmlns:dubbo="/schema/dubbo"6 xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.5.xsd7 /schema/dubbo /schema/dubbo/dubbo.xsd">89<dubbo:application name="demo-provider" owner="programmer" organization="dubbox"/>1011<dubbo:registry address="zookeeper://127.0.0.1:2181"/>1213<dubbo:protocol name="dubbo" serialization="kryo" optimizer="yjmyzz.dubbo.demo.api.SerializationOptimizerImpl"/>1415<!-- use tomcat server -->16<dubbo:protocol name="rest" port="8888" threads="500" contextpath="services" server="tomcat" accepts="500"17 extension="com.alibaba.dubbo.rpc.protocol.rest.support.LoggingFilter"/>181920<dubbo:service interface="erService" ref="userService" protocol="dubbo"/>2122<dubbo:service interface="erRestService" ref="userRestService" protocol="rest" validation="true"/>2324<bean id="userService" class="erServiceImpl"/>2526<bean id="userRestService" class="erRestServiceImpl">27<property name="userService" ref="userService"/>28</bean>293031</beans>View Codepom.xml1<?xml version="1.0" encoding="UTF-8"?>2<project xmlns="/POM/4.0.0"3 xmlns:xsi="/2001/XMLSchema-instance"4 xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">56<modelVersion>4.0.0</modelVersion>78<groupId>blogs.yjmyzz</groupId>9<artifactId>dubbo-hello-provider</artifactId>10<version>0.1</version>1112<dependencies>1314<!--公⽤的服务接⼝-->15<dependency>16<groupId>blogs.yjmyzz</groupId>17<artifactId>dubbo-hello-api</artifactId>18<version>0.1</version>19</dependency>2021<dependency>22<groupId>com.alibaba</groupId>23<artifactId>dubbo</artifactId>24<version>2.8.4</version>25</dependency>2627<dependency>28<groupId>org.javassist</groupId>29<artifactId>javassist</artifactId>30<version>3.15.0-GA</version>31</dependency>3233<dependency>34<groupId>org.apache.mina</groupId>35<artifactId>mina-core</artifactId>36<version>1.1.7</version>41<artifactId>grizzly-core</artifactId>42<version>2.1.4</version>43</dependency>4445<dependency>46<groupId>org.apache.httpcomponents</groupId> 47<artifactId>httpclient</artifactId>48<version>4.2.1</version>49</dependency>5051<dependency>52<groupId>com.alibaba</groupId>53<artifactId>fastjson</artifactId>54<version>1.1.39</version>55</dependency>5657<dependency>58<groupId>com.thoughtworks.xstream</groupId>59<artifactId>xstream</artifactId>60<version>1.4.1</version>61</dependency>6263<dependency>64<groupId>org.apache.bsf</groupId>65<artifactId>bsf-api</artifactId>66<version>3.1</version>67</dependency>6869<dependency>70<groupId>org.apache.zookeeper</groupId>71<artifactId>zookeeper</artifactId>72<version>3.4.6</version>73</dependency>7475<dependency>76<groupId>com.github.sgroschupf</groupId>77<artifactId>zkclient</artifactId>78<version>0.1</version>79</dependency>8081<dependency>82<groupId>org.apache.curator</groupId>83<artifactId>curator-framework</artifactId>84<version>2.5.0</version>85</dependency>8687<dependency>88<groupId>com.googlecode.xmemcached</groupId> 89<artifactId>xmemcached</artifactId>90<version>1.3.6</version>91</dependency>9293<dependency>94<groupId>org.apache.cxf</groupId>95<artifactId>cxf-rt-frontend-simple</artifactId>96<version>2.6.1</version>97</dependency>9899<dependency>100<groupId>org.apache.cxf</groupId>101<artifactId>cxf-rt-transports-http</artifactId>102<version>2.6.1</version>103</dependency>104105<dependency>106<groupId>org.apache.thrift</groupId>107<artifactId>libthrift</artifactId>108<version>0.8.0</version>109</dependency>110111<dependency>112<groupId>com.caucho</groupId>113<artifactId>hessian</artifactId>114<version>4.0.7</version>115</dependency>116117<dependency>118<groupId>javax.servlet</groupId>119<artifactId>javax.servlet-api</artifactId>120<version>3.1.0</version>125<artifactId>jetty</artifactId>126<version>6.1.26</version>127<exclusions>128<exclusion>129<groupId>org.mortbay.jetty</groupId>130<artifactId>servlet-api</artifactId>131</exclusion>132</exclusions>133</dependency>134135<dependency>136<groupId>log4j</groupId>137<artifactId>log4j</artifactId>138<version>1.2.16</version>139</dependency>140141<dependency>142<groupId>org.slf4j</groupId>143<artifactId>slf4j-api</artifactId>144<version>1.6.2</version>145</dependency>146147<dependency>148<groupId>redis.clients</groupId>149<artifactId>jedis</artifactId>150<version>2.1.0</version>151</dependency>152153<dependency>154<groupId>javax.validation</groupId>155<artifactId>validation-api</artifactId>156<version>1.0.0.GA</version>157</dependency>158159<dependency>160<groupId>org.hibernate</groupId>161<artifactId>hibernate-validator</artifactId>162<version>4.2.0.Final</version>163</dependency>164165<dependency>166<groupId>javax.cache</groupId>167<artifactId>cache-api</artifactId>168<version>0.4</version>169</dependency>170171<dependency>172<groupId>org.jboss.resteasy</groupId>173<artifactId>resteasy-jaxrs</artifactId>174<version>3.0.7.Final</version>175</dependency>176177<dependency>178<groupId>org.jboss.resteasy</groupId>179<artifactId>resteasy-client</artifactId>180<version>3.0.7.Final</version>181</dependency>182183<dependency>184<groupId>org.jboss.resteasy</groupId>185<artifactId>resteasy-netty</artifactId>186<version>3.0.7.Final</version>187</dependency>188189<dependency>190<groupId>org.jboss.resteasy</groupId>191<artifactId>resteasy-jdk-http</artifactId>192<version>3.0.7.Final</version>193</dependency>194195<dependency>196<groupId>org.jboss.resteasy</groupId>197<artifactId>resteasy-jackson-provider</artifactId> 198<version>3.0.7.Final</version>199</dependency>200201<dependency>202<groupId>org.jboss.resteasy</groupId>203<artifactId>resteasy-jaxb-provider</artifactId> 204<version>3.0.7.Final</version>208<groupId>org.apache.tomcat.embed</groupId>209<artifactId>tomcat-embed-core</artifactId>210<version>8.0.11</version>211</dependency>212213<dependency>214<groupId>org.apache.tomcat.embed</groupId>215<artifactId>tomcat-embed-logging-juli</artifactId>216<version>8.0.11</version>217</dependency>218219<dependency>220<groupId>com.esotericsoftware.kryo</groupId>221<artifactId>kryo</artifactId>222<version>2.24.0</version>223</dependency>224225<dependency>226<groupId>de.javakaffee</groupId>227<artifactId>kryo-serializers</artifactId>228<version>0.26</version>229</dependency>230231<dependency>232<groupId>de.ruedigermoeller</groupId>233<artifactId>fst</artifactId>234<version>1.55</version>235</dependency>236237</dependencies>238239240</project>View Code测试时,运⾏DemoProvider中的main⽅法即可启动服务,所有服务注册在ZooKeeper,层次结构类似下⾯这样:/dubbo/dubbo/erRestService/dubbo/erRestService/providers/dubbo/erRestService/configurators/dubbo/erService/dubbo/erService/providers/dubbo/erService/configurators三、服务消费⽅DemoConsumer.javapackage yjmyzz.dubbo.demo.consumer;import org.springframework.context.support.ClassPathXmlApplicationContext;import erService;import javax.ws.rs.client.Client;import javax.ws.rs.client.ClientBuilder;import javax.ws.rs.client.WebTarget;import javax.ws.rs.core.Response;public class DemoConsumer {public static void main(String[] args) {final String port = "8888";//测试Rest服务getUser("http://localhost:" + port + "/services/users/1.json");getUser("http://localhost:" + port + "/services/users/1.xml");//测试常规服务ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:META-INF/spring/*.xml");context.start();UserService userService = context.getBean(UserService.class);System.out.println(userService.getUser(1L));}private static void getUser(String url) {System.out.println("Getting user via " + url);Client client = ClientBuilder.newClient();WebTarget target = client.target(url);Response response = target.request().get();try {if (response.getStatus() != 200) {throw new RuntimeException("Failed with HTTP error code : " + response.getStatus());}System.out.println("Successfully got result: " + response.readEntity(String.class));} finally {response.close();client.close();}}}配置⽂件:resources\META-INF\spring\dubbo-hello-consumer.xml1<?xml version="1.0" encoding="UTF-8"?>2<beans xmlns="/schema/beans"3 xmlns:xsi="/2001/XMLSchema-instance"4 xmlns:dubbo="/schema/dubbo"5 xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.5.xsd6 /schema/dubbo /schema/dubbo/dubbo.xsd">78<dubbo:application name="demo-consumer" owner="programmer" organization="dubbox"/>910<dubbo:registry address="zookeeper://127.0.0.1:2181"/>1112<dubbo:reference id="userRestService" interface="erRestService"/>1314<dubbo:reference id="userService" interface="erService"/>1516</beans>View Codepom.xml1<?xml version="1.0" encoding="UTF-8"?>2<project xmlns="/POM/4.0.0"3 xmlns:xsi="/2001/XMLSchema-instance"4 xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">56<modelVersion>4.0.0</modelVersion>78<groupId>blogs.yjmyzz</groupId>9<artifactId>dubbo-hello-consumer</artifactId>10<version>0.1</version>111213<dependencies>14<!--公⽤的服务接⼝-->15<dependency>16<groupId>blogs.yjmyzz</groupId>17<artifactId>dubbo-hello-api</artifactId>18<version>0.1</version>19</dependency>202122<dependency>23<groupId>com.alibaba</groupId>24<artifactId>dubbo</artifactId>25<version>2.8.4</version>26</dependency>2728<dependency>29<groupId>org.javassist</groupId>30<artifactId>javassist</artifactId>31<version>3.15.0-GA</version>32</dependency>3334<dependency>35<groupId>org.apache.mina</groupId>36<artifactId>mina-core</artifactId>37<version>1.1.7</version>38</dependency>3940<dependency>41<groupId>org.glassfish.grizzly</groupId>42<artifactId>grizzly-core</artifactId>4546<dependency>47<groupId>org.apache.httpcomponents</groupId> 48<artifactId>httpclient</artifactId>49<version>4.2.1</version>50</dependency>5152<dependency>53<groupId>com.alibaba</groupId>54<artifactId>fastjson</artifactId>55<version>1.1.39</version>56</dependency>5758<dependency>59<groupId>com.thoughtworks.xstream</groupId>60<artifactId>xstream</artifactId>61<version>1.4.1</version>62</dependency>6364<dependency>65<groupId>org.apache.bsf</groupId>66<artifactId>bsf-api</artifactId>67<version>3.1</version>68</dependency>6970<dependency>71<groupId>org.apache.zookeeper</groupId>72<artifactId>zookeeper</artifactId>73<version>3.4.6</version>74</dependency>7576<dependency>77<groupId>com.github.sgroschupf</groupId>78<artifactId>zkclient</artifactId>79<version>0.1</version>80</dependency>8182<dependency>83<groupId>org.apache.curator</groupId>84<artifactId>curator-framework</artifactId>85<version>2.5.0</version>86</dependency>8788<dependency>89<groupId>com.googlecode.xmemcached</groupId> 90<artifactId>xmemcached</artifactId>91<version>1.3.6</version>92</dependency>9394<dependency>95<groupId>org.apache.cxf</groupId>96<artifactId>cxf-rt-frontend-simple</artifactId>97<version>2.6.1</version>98</dependency>99100<dependency>101<groupId>org.apache.cxf</groupId>102<artifactId>cxf-rt-transports-http</artifactId>103<version>2.6.1</version>104</dependency>105106<dependency>107<groupId>org.apache.thrift</groupId>108<artifactId>libthrift</artifactId>109<version>0.8.0</version>110</dependency>111112<dependency>113<groupId>com.caucho</groupId>114<artifactId>hessian</artifactId>115<version>4.0.7</version>116</dependency>117118<dependency>119<groupId>javax.servlet</groupId>120<artifactId>javax.servlet-api</artifactId>121<version>3.1.0</version>122</dependency>123124<dependency>125<groupId>org.mortbay.jetty</groupId>126<artifactId>jetty</artifactId>129<exclusion>130<groupId>org.mortbay.jetty</groupId>131<artifactId>servlet-api</artifactId>132</exclusion>133</exclusions>134</dependency>135136<dependency>137<groupId>log4j</groupId>138<artifactId>log4j</artifactId>139<version>1.2.16</version>140</dependency>141142<dependency>143<groupId>org.slf4j</groupId>144<artifactId>slf4j-api</artifactId>145<version>1.6.2</version>146</dependency>147148<dependency>149<groupId>redis.clients</groupId>150<artifactId>jedis</artifactId>151<version>2.1.0</version>152</dependency>153154<dependency>155<groupId>javax.validation</groupId>156<artifactId>validation-api</artifactId>157<version>1.0.0.GA</version>158</dependency>159160<dependency>161<groupId>org.hibernate</groupId>162<artifactId>hibernate-validator</artifactId>163<version>4.2.0.Final</version>164</dependency>165166<dependency>167<groupId>javax.cache</groupId>168<artifactId>cache-api</artifactId>169<version>0.4</version>170</dependency>171172<dependency>173<groupId>org.jboss.resteasy</groupId>174<artifactId>resteasy-jaxrs</artifactId>175<version>3.0.7.Final</version>176</dependency>177178<dependency>179<groupId>org.jboss.resteasy</groupId>180<artifactId>resteasy-client</artifactId>181<version>3.0.7.Final</version>182</dependency>183184<dependency>185<groupId>org.jboss.resteasy</groupId>186<artifactId>resteasy-netty</artifactId>187<version>3.0.7.Final</version>188</dependency>189190<dependency>191<groupId>org.jboss.resteasy</groupId>192<artifactId>resteasy-jdk-http</artifactId>193<version>3.0.7.Final</version>194</dependency>195196<dependency>197<groupId>org.jboss.resteasy</groupId>198<artifactId>resteasy-jackson-provider</artifactId> 199<version>3.0.7.Final</version>200</dependency>201202<dependency>203<groupId>org.jboss.resteasy</groupId>204<artifactId>resteasy-jaxb-provider</artifactId> 205<version>3.0.7.Final</version>206</dependency>207208<dependency>209<groupId>org.apache.tomcat.embed</groupId> 210<artifactId>tomcat-embed-core</artifactId>211<version>8.0.11</version>212</dependency>213214<dependency>215<groupId>org.apache.tomcat.embed</groupId>216<artifactId>tomcat-embed-logging-juli</artifactId>217<version>8.0.11</version>218</dependency>219220<dependency>221<groupId>com.esotericsoftware.kryo</groupId>222<artifactId>kryo</artifactId>223<version>2.24.0</version>224</dependency>225226<dependency>227<groupId>de.javakaffee</groupId>228<artifactId>kryo-serializers</artifactId>229<version>0.26</version>230</dependency>231232<dependency>233<groupId>de.ruedigermoeller</groupId>234<artifactId>fst</artifactId>235<version>1.55</version>236</dependency>237</dependencies>238239240</project>View Code其它注意事项:dubbo构架中,zk充着“服务注册中⼼”的⾓⾊,所以⽣产者与消费者的xml配置⽂件中,都要配置zk地址,如果zk采⽤集群部署时,配置写法参考下⾯这样:<dubbo:registry address="zookeeper://172.28.*.102:2181?backup=172.28.*.102:2182,172.28.*.102:2183"/>dubbo还有⼀个管理界⾯,⽤于服务治理,包括启⽤/禁⽤服务,设置服务的路由规则(即:A地址的Consumer直接调⽤B机器的Provider,⽽不是由负载均衡算法分配)等等。
dubbo工作原理和机制
Dubbo是一款高性能、轻量级的分布式服务框架,它基于Java语言开发,致力于提供服务治理、服务调用和服务容错等一系列的分布式服务治理方案。
Dubbo 框架采用了一些关键的技术,如Netty网络通信框架、高效的序列化协议和注册中心等,使得Dubbo能够快速、可靠地运行大规模高并发的分布式应用系统。
Dubbo的工作原理主要是通过服务消费者、服务提供者和注册中心三个角色之间的协作来实现分布式服务的调用。
服务提供者将自己提供的服务发布到注册中心,服务消费者从注册中心中获取到服务提供者的地址列表,然后通过负载均衡算法选择其中一台服务提供者进行调用。
在调用服务提供者的过程中,Dubbo 框架会自动进行服务容错处理,例如超时重试、熔断降级等,确保服务的高可用性和可靠性。
Dubbo框架的工作机制主要分为两个部分:远程通信和服务治理。
远程通信部分主要是指Dubbo框架通过Netty网络通信框架实现了高效、可靠的RPC远程调用,同时支持多种序列化协议,如Hessian、Protobuf、JSON等,保证了服务之间的数据传输的高效和可扩展性。
服务治理部分主要是指Dubbo框架提供了完善的服务治理功能,包括动态配置、服务路由、负载均衡、集群容错等,保证了分布式应用系统的高可用性和可扩展性。
总体来说,Dubbo框架的工作原理和机制非常灵活和可扩展,可以根据项目的
实际需求进行灵活配置和使用。
通过Dubbo框架可以快速搭建分布式应用系统,提高系统的性能和可靠性。
dubbo案例Dubbo是阿里巴巴开源的分布式服务框架,可以提供高性能、透明化的RPC远程服务调用功能,使得应用的开发更加简单和高效。
下面我们以一个在线购物网站为例,来介绍Dubbo的使用案例。
假设这个购物网站由前端、后端和数据库组成。
前端负责展示商品信息、购物车管理和下单操作,后端负责处理前端的请求并调用相应的服务,数据库则用来存储商品和用户信息。
首先,前端需要调用后端的服务来获取商品信息并展示在网页上。
在Dubbo中,我们可以定义一个服务接口ProductService,包含获取商品信息的方法getProductInfo()。
后端实现该接口,提供相应的服务,同时在Dubbo配置文件中指定该服务的端口号和版本号。
前端可以通过Dubbo提供的服务暴露和引用功能,从而实现远程调用后端的服务。
在前端的代码中,通过Dubbo的@Service注解将ProductService暴露为一个Dubbo服务,并在Dubbo配置文件中指定该服务的地址和端口号。
接下来,在前端的页面加载时,调用getProductInfo()方法来获取商品信息。
Dubbo会负责将该请求发送给后端,并将结果返回给前端。
前端可以根据返回的结果来展示商品信息。
此外,前端还可以调用后端的服务来进行购物车管理和下单操作。
在Dubbo中,我们可以定义一个服务接口CartService,包含添加商品到购物车和生成订单的方法。
后端实现该接口,提供相应的服务。
在前端的代码中,通过Dubbo的@Reference注解引用CartService,并调用相应的方法来实现购物车管理和下单操作。
Dubbo会负责将这些请求发送给后端,并将结果返回给前端。
总结一下,以上就是一个使用Dubbo的在线购物网站的案例。
通过Dubbo的高性能、透明化的RPC远程服务调用能力,前端可以方便地调用后端的服务来获取商品信息、进行购物车管理和下单操作。
这样不仅提升了整个网站系统的性能和效率,还简化了应用的开发。