1、为什么要使用Dubbo
2、本地调用和远程调用
3、RPC框架
4、Dubbo的配置
5、注意事项
为什么使用Dubbo:
1、需要进行项目之间的相互调用(跨域),以达到某种效果,所以用到了Dubbo
eg:在第一个项目中,用到了数据源,在第二个项目中也用到了同样的数据源,用的甚至可能是同一张表
那我是不是可以在进行第二个项目的编写时,不去配置数据源了,去使用第一个项目中配置好的数据源,
这样一来,代码进行了简化,这就被称作远程调用。
2、为了实现远程调用,但在restful风格中,restfule需要把用户的登录状态暴露在http中,一旦被截获,
可能导致整个项目的运行处事故,而且restful是使用controller调用controller,这样不符合MVC的设计思想。
3、为了既能远程调用,还要安全且符合MVC的设计思想,开始使用RPC(remote preducer call):远程过程调用。
!!springcloud依然延续使用Restful。
本地调用:
在同一个项目/同一个域中,发起调用请求,最终达到某种目的,称之为本地调用。
远程调用:
在不同的项目中/不同的域中,发起调用请求,最终达到某种目的,称之为远程调用。
RPC框架:
dubbo是RPC中的一个很优秀的框架,由阿里巴巴开发,贡献给了apache软件基金会。
当当网使用的dubbox
京东使用的是JSF
spring公司使用的是springcloud
dubbo:
dubbo是阿里巴巴开发的一个高性能、轻量级、基于Java的开源RPC框架。
dubbo的三大核心:
面向接口的风格
容错和负载均衡
自动的服务注册和服务实现
面向接口的风格:
restful是controller调用controller
dubbo是controller调用service(只需要在本项目中定义接口即可,不需要实现类)
容错:
在项目运行中即使出现了错误,仍然可以继续运行的解决方案就叫做容错
自动的服务注册和服务发现:
是用到了zookeeper注册中心,通过zookeeper来实现自动的服务注册和发现。
在Linux中配置dubbo:
1、配置zookeeper集群
2、配置jdk
3、配置maven
4、配置Tomcat
5、进行dubbo的配置:
解压压缩包:tar -zxvf xxxxx
进入dubbo的目录进行编译命令: mvn install -Dmaven.test.skip=true
找到dubbo-admin目录,进入target,找到dubbo-admin-2.5.7.war
找到Tomcat中的webapps,在此下面有个ROOT项目,删掉它
使用cp -r 将dubbo-admin-2.5.7.war复制到Tomcat下的WebApps中,
将dubbo-admin-2.5.7.war改名为ROOT,取代原有的ROOT项目,
去bin目录下执行./startup.sh命令 启动Tomcat,然后可以在WebApps下看到war包被编译出来了
修改dubbo的配置文件(在WEB-INF目录下的dubbo.properties)
dubbo.registry.address=zookeeper://127.0.0.1:2181
将IP地址改成自己配置的zookeeper集群的其中一台IP
在该配置文件下还有两行,分别为:dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
这是在浏览器上启动dubbo项目时需要输入的两种用户名以及对应的密码
配置完成,去浏览器输入该dubbo服务器的IP加8080端口号,由于原来的Tomcat自带的项目已经被删除,由dubbo的项目去取代了,
所以将看到的是dubbo的展示页面。
dubbo所必须要知道的注意事项:
1、所有的service层必须要使用service注解(之前用的spring框架的,现在用dubbo框架所提供的@Service注解)
@Service(timeout=单位是秒)
2、在配置dubbo端口号的时候
只是provider项目和consumer项目直接数据通讯的时候所必需的的要遵循的端口号
也只是说必须要注意无论是provider还是consumer,所配置的dubbo端口号必须要保持一致
端口号随意定制!
3、无论是在dubbo还是在provider以及consumer的zookeeper配置中,所有的zookeeper集群无论是leader还是follower
都可以配:
eg:
zookeeper01是leader
dubbo-admin------>把zookeeper的配置改为--->zookeeper01
zookeeper02是leader
dubbo-admin------->把zookeeper的配置仍可改为--->zookeeper01
以上,无论zookeeper的leader是谁,dubbo-admin中的IP只要是zookeeper集群的其中一台就行,因为最终都会转交给leader(除非leader宕机)
所有的zookeeper配置的端口号都应该是2181,因为dubbo中的端口号就是2181
4、dubbo如何判定项目为服务器的生产者还是消费者?
在项目中的配置文件application.properties中所配置的dubbo.scan.base-packages属性来进行判断该项目时provider还是consumer:
如果是服务生产者的话,需要配置包扫描,而消费者不需要。
5.无论是provider还是consumer,service包必须要保持一致
provider-->IUserService:com.aaa.lee.dubbo.service
consumer-->IUserService:com.aaa.lee.dubbo.service
并且两个接口的名字也必须要保持一致!!!!
接口中方法也必须要保持一致(返回值名称,返回值类型,方法名,方法参数)
6.consumer项目中的controller需要调用service的时候,不能再使用@Autowired注解进行注入service
因为整个consumer项目中只有service的接口并没有实现类
需要使用dubbo所提供的@Reference
7.provider和consumer的application.properties配置文件中dubbo.application.name不能一样!!!!
provider: dubbo.application.name=user-provider
consumer: dubbo.application.name=user-consumer
8.无论是provider还是consumer项目都必须要把zookeeper的地址配置一致!!!
不要求必须配置leader--->follower会自动把请求转交给leader
9.所有的实体类必须要实现序列化接口
因为实现了序列化接口的实体类都可以把实体类以流的形式进行发送
provider会把User实体类转换为二进制流----->发送给consumer---->consumer所接收到的并不是一个User对象,而是一个二进制流
---->consumer必须要把整个二进制流转换为User对象才可以使用!
也就是说无论是consumer还是provider都必须要实现序列化接口