【Java23】maven加强,分布式RPC框架Dubbo
文章目录
- 1.maven的继承
- 2.maven的聚合
- 3.RPC
- 4.软件演进
- 5.Dubbo和注册中心zookeeper
- 6.Dubbo创建接口工程
- 7.Dubbo创建服务提供者(Provider)
- 8.Dubbo创建服务消费者(Consumer)
1.maven的继承
//pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>ssm_parent</artifactId><!-- 父工程必须打pom包--><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>ssm_child</module></modules><properties><!-- 依赖版本的统一管理 --><mybatis.version>3.4.6</mybatis.version></properties><!--dependencyManagement并不会真的去引入依赖,只是锁定依赖的版本号一般用在父工程中,--><dependencyManagement><dependencies><!-- mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency><!--测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!--spring的ioc--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.6.RELEASE</version></dependency><!--spring和mybatis整合--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency><!-- 德鲁伊连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.9</version></dependency><!--spring的jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.0.6.RELEASE</version></dependency><!-- springMVC的依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.0.6.RELEASE</version></dependency><!--spring的web相关的依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.0.6.RELEASE</version></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!--spring的事务--><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.0.6.RELEASE</version></dependency><!--spring的aop--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.6.RELEASE</version></dependency></dependencies></dependencyManagement><build><plugins><!-- java编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
</project>
//pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- 引入父工程的坐标--><parent><artifactId>ssm_parent</artifactId><groupId>com.itheima</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ssm_child</artifactId><dependencies><!-- mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies><build><plugins><!-- java编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
</project>
2.maven的聚合
所谓的横向的拆分就是我们平常说的三层架构,将项目分成了web层,service层、dao层(web层也被叫做表现层,
service层也被叫做业务层,dao层也被持久层),可以理解为将一个功能模块的不同调用过程进行了水平方向的拆分。所谓的纵向拆分就是将一个项目的多个功能模块进行了拆分,可以理解成为了完成一个系统,深度(纵向)分析
需要有哪些功能,然后将这些功能独立出来,进行了(纵向)拆分。拆分后,每个功能模块进行了单独的开发之后,在整合项目时就需要有一个能够整合这些项目或者模块的工程,
这就是所谓聚合工程的意义。建立聚合工程需要注意:1.该聚合项目本身也做为一个Maven项目,它必须有自己的POM。2.它的打包方式必须为: pom3.引入了新的元素:module,子模块
如下web工程要发布,所以打war包。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>ssm_par</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><!-- 声明所有的子模块 --><modules><module>ssm_domain</module><module>ssm_mapper</module><module>ssm_service</module><module>ssm_web</module></modules><dependencies><!-- mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency><!--测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!--spring的ioc--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.6.RELEASE</version></dependency><!--spring和mybatis整合--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency><!-- 德鲁伊连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.9</version></dependency><!--spring的jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.0.6.RELEASE</version></dependency><!-- springMVC的依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.0.6.RELEASE</version></dependency><!--spring的web相关的依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.0.6.RELEASE</version></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!--spring的事务--><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.0.6.RELEASE</version></dependency><!--spring的aop--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.6.RELEASE</version></dependency></dependencies><build><plugins><!-- java编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>ssm_par</artifactId><groupId>com.itheima</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ssm_domain</artifactId><build><plugins><!-- java编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>ssm_par</artifactId><groupId>com.itheima</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ssm_mapper</artifactId><dependencies><!-- 引入domain工程的坐标--><dependency><groupId>com.itheima</groupId><artifactId>ssm_domain</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies><build><plugins><!-- java编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>ssm_par</artifactId><groupId>com.itheima</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ssm_service</artifactId><dependencies><dependency><groupId>com.itheima</groupId><artifactId>ssm_mapper</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies><build><plugins><!-- java编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>ssm_par</artifactId><groupId>com.itheima</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><packaging>war</packaging><artifactId>ssm_web</artifactId><dependencies><dependency><groupId>com.itheima</groupId><artifactId>ssm_service</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies><build><plugins><!-- java编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
</project>
如下dao层换成mybatis开发,web层换成controller开发。
3.RPC
RPC:远程过程调用,我这台电脑调用一个函数,这个函数在另一个电脑上执行。这种方式就像是本地正常的一次函数一样,不需要关注远程(网络连接,断开,传数据)细节。 如下a和b两个参数打包发给服务端。
1.
为什么远程remote?本机运行的程序主要干的事是A,执行A的过程需要借助B功能,但是B功能不属于A功能范围内事情。所以我们会调实现B功能的集群,获取它们计算出来的结果。请求和响应和HTTP协议很像,grpc谷歌框架就是使用了http协议。
3 .
数据包该如果封?程序内存中数据结构
封装到传输时数据结构(文本或字节数组)
,传来后还要将数据(即字节或文本)恢复到内存中,这传一次就叫做序列化和反序列化
。HTTP中json等就是序列化方式,一个数据在内存中的表达可能没法直接给人看的,或者没法直接两个进程间无法互相阅读的,除了共享内存。json和xml都是文本化的序列化方式
,高效的grpc中一般不会用json这种序列化方式,比如用jdk自己的序列化方式,protobuf等。
4 .
如果需要提高rpc性能的话除了序列化和反序列化,数据传输过程中需要提高网络IO性能。网络IO中涉及很多的系统调用,有对这些系统调用较好的封装如java中有名的rpc框架dubbo
。dubbo中使用netty作为网络传输的一个框架实现,netty又是基于java的NIO,NIO最终调用一些系统调用,这些系统调用能够实现网络传输过程中零拷贝,多路复用等等充分提高了网络性能。
4.软件演进
单体架构
:一个tomcat正常200并发量。
垂直架构
:每个系统独立,通过复制通讯。
SOA架构
:rpc调用,如果商品服务用的最多,撑不起那么大流量了,把商品服务再部署一份,怎么能保证其它系统调用把请求均匀分散到多个服务上去呢?也要实现负载均衡。
微服务架构
:更多服务器。
5.Dubbo和注册中心zookeeper
Container
相当于tomcat容器或spring ioc容器。
Provider
就是服务提供者,业务逻辑的实现。
Registry
相当于菜单(挂了没事,本地会缓存一份)。
Monitor
监控应用程序调用了多少次,响应的速度是不是够快,都能进行监控。
Dubbo官方推荐使用Zookeeper(像数据库一样,目录树状结构)作为服务注册中心。其它的dubbo支持的注册中心
有:redis、nacos。
zookeeper软件使用:第一步
:下载地址:http://archive.apache.org/dist/zookeeper/
第二步
:把 zookeeper 的压缩包(zookeeper-3.4.6.tar.gz)上传到 linux 系统。
第三步
:解压缩压缩包:tar -zxvf zookeeper-3.4.6.tar.gz。
第四步
:进入zookeeper-3.4.6目录,创建data目录。
第五步
:进入conf目录 ,把zoo_sample.cfg 改名为zoo.cfg
:mv zoo_sample.cfg zoo.cfg。
第六步
:打开zoo.cfg文件, 修改data属性:dataDir=/usr/zookeeper-3.4.6/data。
进入Zookeeper的bin目录,启动服务命令 : ./zkServer.sh start。
停止服务命令:./zkServer.sh stop 。
查看服务状态命令:./zkServer.sh status 。ps -ef|grep zookeeper。
6.Dubbo创建接口工程
serviceImpl = Provider 。Controller = Consumer 。
File-New-Project-Maven
//pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima.dubbo</groupId><artifactId>dubbo-interface</artifactId><version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <!--java工程打包方式为jar--><description>定义业务接口</description>
</project>
package com.itheima.dubbo;public interface HelloService { //定义接口String say(String name);
}
如下点击后就不用管了,把整个项目打成jar包后即安装到了maven仓库。
7.Dubbo创建服务提供者(Provider)
用tomcat运行业务实现,所以创建web工程。
//pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima.dubbo</groupId><artifactId>dubbo-provider</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging> <!--web工程打war包--><name>dubbo-provider Maven Webapp</name><properties><spring.version>5.0.5.RELEASE</spring.version> <!--版本--></properties><dependencies><dependency> <!--导入dubbo-interface的jar包--><groupId>com.itheima.dubbo</groupId><artifactId>dubbo-interface</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency> <!--导入dubbo和spring相关的jar包--><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><!-- dubbo相关 --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.7</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><!--数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--数据库连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.6</version></dependency><!--mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.2</version></dependency></dependencies>
</project>
package com.itheima.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.dubbo.HelloService;
import org.springframework.transaction.annotation.Transactional;@Service(interfaceClass = HelloService.class)
@Transactional
public class HelloServiceImpl implements HelloService {
//业务逻辑,把它发布成服务才行,发布服务依赖dubbo,因为dubbo实现了远程调用,实现了comsumer调用provide。
//所以dubbo配置也需要,也要下载一些dubbo相关的jar包。public String say(String s) {System.out.println("=====我被调用了");return "say hi " + s;}
}
如上普通工程变成了dubbo工程,接下来怎么通过dubbo将服务发布出去,需要将spring和dubbo进行集成,集成文件如下。
//dubbo-provider.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:dubdo="http://code.alibabatech.com/schema/dubbo"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 当前应用名称。用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样 --><dubbo:application name="dubbo-provider" /><!-- 连接服务注册中心zookeeper ip为zookeeper所在服务器的ip地址,需要先开启zookeeper,默认2181端口,可在.cfg文件里修改端口。注册信息保存到zookeeper里了--><dubbo:registry address="zookeeper://127.0.0.1:2181"/><!-- 消费者和提供者通讯:协议(数据结构的约定)和port:端口默认是20880,协议有rmi,rest,http --><dubbo:protocol name="dubbo" port="20881"></dubbo:protocol><!-- 扫描指定包,加入@Service注解的类会被发布为服务1.路径匹配package2.类上使用了@Service注解--><dubbo:annotation package="com.itheima.service.impl" /> <!--哪个目录下的类被发布为服务-->
</beans>
怎么启动这个服务呢?我们使用了spring,通过加载spring容器读进来才能启动服务。如下配置context指定加载spring路径,通过listener创建ioc容器,启动还要指定tomcat。
//web.xml
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app><display-name>Archetype Created Web Application</display-name><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:dubbo-provider.xml,classpath:applicationContext-dao.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
</web-app>
点击绿色+号Tomcat Server - local。
8.Dubbo创建服务消费者(Consumer)
创建服务消费者(springmvc)工程,服务消费者
调用服务提供者。先创建web工程步骤如上。
//pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima.dubbo</groupId><artifactId>dubbo-comsumer</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>dubbo-comsumer Maven Webapp</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target><spring.version>5.0.5.RELEASE</spring.version></properties><dependencies><!--注意: 在消费者引入,需要调用业务逻辑的接口--><dependency><groupId>com.itheima.dubbo</groupId><artifactId>dubbo-interface</artifactId><version>1.0-SNAPSHOT</version></dependency><!--spring相关--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><!-- dubbo相关 --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.7</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency></dependencies>
</project>
package com.itheima.dubbo.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.dubbo.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping
@RestController
public class HelloController {@Reference(check = false,timeout = 10000) //com.alibaba.dubbo.
//现在是远程调用:本地通过HelloService接口生成的远程接口的代理,所以不能使用@AutowiredHelloService helloService; @RequestMapping("/hello") public String hello(String name){ return helloService.say(name); //调用业务逻辑service}
}
接下来还要将客户端即消费者工程和dubbo进行集成。
//dubbo-consumer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:dubdo="http://code.alibabatech.com/schema/dubbo"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样 --><dubbo:application name="dubbo-comsumer" /><!-- 连接服务注册中心zookeeper ip为zookeeper所在服务器的ip地址--><dubbo:registry address="zookeeper://127.0.0.1:2181"/><!-- 扫描指定包,扫描将指定路径下的 @References注解的对象进行注入 --><dubbo:annotation package="com.itheima.dubbo.controller" />
</beans>
如下还要配置springmvc。
//web.xml
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param> <!--启动参数--><param-name>contextConfigLocation</param-name><param-value>classpath:dubbo-comsumer.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>
同理配置一个tomcat,端口改为81。
【Java23】maven加强,分布式RPC框架Dubbo相关推荐
- 分布式RPC框架dubbo、motan、rpcx、gRPC、thrift简介与性能比较
分布式RPC框架性能大比拼 dubbo.motan.rpcx.gRPC.thrift的性能比较 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现 ...
- grpc框架_分布式RPC框架dubbo、motan、rpcx、gRPC、thrift简介与性能比较
Dubbo Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.曾有一段时间放弃维护,不过当前 ...
- 分布式RPC框架Dubbo详解
目录 1.架构演进 1.1 单体架构 1.2 垂直架构 1.3 分布式架构 1.4 SOA架构 1.5 微服务架构 2.RPC框架 2.1 RPC基本概念介绍 2.1.1 RPC协议 2.1.2 R ...
- dubbo 自定义路由_高性能可扩展分布式RPC框架Dubbo内核原理揭秘
一.前言 整体来说,一个公司业务系统的演进流程基本都是从单体应用到多体应用.在单体应用时,不同业务模块相互调用直接在本地 JVM 进程内就可以完成;而变为多个应用时,相互之间进行通信的方式就不能简单的 ...
- dubbo-快速入门-分布式RPC框架Apache Dubbo
文章目录 分布式RPC框架Apache Dubbo 1. 软件架构的演进过程 1.1 单体架构 1.2 垂直架构 1.3 SOA架构 1.4 微服务架构 2. Apache Dubbo概述 2.1 D ...
- 分布式RPC框架Apache Dubbo
分布式RPC框架Apache Dubbo 1. 软件架构的演进过程 软件架构的发展经历了由单体架构.垂直架构.SOA架构到微服务架构的演进过程,下面我们分别了解一下这几个架构. 1.1 单体架构 1. ...
- RPC 框架 Dubbo 从理解到使用(一)
技术架构演变 学习 Dubbo 之前我们有必要先来了解一下互联网技术架构的演变过程及通信方式,方便我们搞清楚为什么需要使用基于 RPC 思想的系列框架. 单一应用架构 通俗地讲,"单体应用( ...
- 轻量级分布式 RPC 框架
RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Servi ...
- 分布式RPC实践--Dubbo基础篇
2019独角兽企业重金招聘Python工程师标准>>> 简介 Dubbo是阿里巴巴开源的一个高性能的分布式RPC框架,整个框架的核心原理来源于生产者与消费者的运作模型:框架的核心分4 ...
最新文章
- 加州伯克利计算机专业录取条件,2020加州大学伯克利分校的计算机专业条件是什么?...
- list类型的应用场景 —— Redis实战经验
- Redis集群配置和常见异常解决
- python类型转换-马哥教育官网-专业Linux培训班,Python培训机构
- 为虚幻引擎4设置Visual Studio
- 下载文件根据浏览器判断文件名,解决兼容性问题
- “每天AI资讯这么多!该看哪些?”推荐一份优质资料清单
- linux新建用户切换后显示-bash-4.1$(转载)
- SQL 两张结构一样的表合并查询
- before和after怎么区分_深入理解::before/:before和::after/:after的使用
- 盘点2009:Office办公软件谁主江湖
- 【CV-Paper 08】ResNet:Deep Residual Learning for Image Recognition
- COSCon'20 Apache Roadshow- China 精彩收官!|城市回顾篇
- Jupyter关联规则挖掘-莫名其妙的问题
- 市占率第一,是vivo的起点还是终点?
- ASP.NET搜索引擎
- POJ 2210 Metric Time G++
- git amend如何撤销
- Js 获取日期加(减)一天并规范日期格式
- 开发者周刊:英特尔再爆重大芯片漏洞;微软开源Bing搜索关键算法;Facebook联合创始人呼吁拆分Facebook
热门文章
- asp.net超过字数限制用省略号...表示
- .net aes加密视频等文件
- [linux]cp和mv对文件和链接影响的区别
- orcle抽数据到mysql_抽取oracle数据到mysql数据库的实现过程
- java如何调用网页_如何使用网页开发自己的app,在网页中的按钮与自己的java代码绑定来实现打电话即javascript代码调用java代码,和java代码来调用javascript代码...
- mysql暂停触发器_mysql如何临时禁用触发器
- a卡显存测试软件_官方游戏性能堪比RTX 3080 苏姿丰:RX 6000 Big Navi是史上最强A卡...
- 最短路径Dijkstra(静态邻接表+优先队列模板)+ 记忆化搜索
- 浙商银行2011.11.26校园招聘会笔试题
- haproxy的丰富特性简介