分布式理解
遠(yuǎn)程分布式的服務(wù)調(diào)用,其實(shí)可以類比service掉dao層,service掉dao層是基于Spring的依賴注入@Autowired進(jìn)行調(diào)用的,而分布式其實(shí)就可以看成類似的調(diào)用方式,只是被調(diào)用方的注入方式@Reference及相關(guān)參數(shù)url(服務(wù)注冊(cè)地址)進(jìn)入注入,而被調(diào)用的這些服務(wù)被注冊(cè)在Zookeeper注冊(cè)中心或Dubbo的注冊(cè)中心進(jìn)行了統(tǒng)一管理。
Zookeeper和Dubbo自帶的注冊(cè)中心,都屬于服務(wù)端發(fā)現(xiàn),用來(lái)代理所注冊(cè)的這些服務(wù),當(dāng)服務(wù)調(diào)用者需要調(diào)用服務(wù)時(shí),只需要通過服務(wù)的注冊(cè)地址,就能找到對(duì)應(yīng)的服務(wù),并不需要關(guān)注服務(wù)是如何尋找的問題,或者服務(wù)名叫什么的問題,這些都被Zookeeper和Dubbo所代理了。下面是服務(wù)端發(fā)現(xiàn)的原理圖:
下面,上干貨github源碼地址:
https://github.com/SpringEE/SpringBoot-dubbo
服務(wù)提供方Provider
@Service(
version = "${demo.service.version}",
application = "${dubbo.application.id}",
protocol = "${dubbo.protocol.id}",
registry = "${dubbo.registry.id}"
)
public class CityServiceImpl implements CityService {
@Override
public City findCityByName(String cityName) {
System.out.println("request cityName: " + cityName);
return new City("武漢", "湖北");
}
}
application.properties
# Spring boot application
spring.application.name = dubbo-provider-demo
## ApplicationConfig Bean
demo.service.version=1.0.0
dubbo.application.id = dubbo-boot-provider
dubbo.application.name = dubbo-boot-provider
## 使用通訊協(xié)議、暴露端口
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
## 注冊(cè)中心
dubbo.registry.id = my-registry
dubbo.registry.address = N/A
服務(wù)消費(fèi)方Consumer
@RestController
public class HelloController {
@Reference(version = "${demo.service.version}",
application = "${dubbo.application.id}",
url = "${dubbo.service.url}")
private CityService cityService;
@RequestMapping("/hello")
public Object hello() {
return cityService.findCityByName("武漢");
}
}
application.properties
spring.application.name=dubbo-boot-consumer
demo.service.version=1.0.0
dubbo.application.id=dubbo-boot-consumer
dubbo.application.name=dubbo-boot-consumer
dubbo.service.url=dubbo://127.0.0.1:20880
配置說(shuō)明
spring.dubbo.application.name 應(yīng)用名稱
spring.dubbo.registry.address 注冊(cè)中心地址
spring.dubbo.protocol.name 協(xié)議名稱
spring.dubbo.protocol.port 協(xié)議端口