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都必須要實現序列化接口