分布式理解
远程分布式的服务调用,其实可以类比service掉dao层,service掉dao层是基于Spring的依赖注入@Autowired进行调用的,而分布式其实就可以看成类似的调用方式,只是被调用方的注入方式@Reference及相关参数url(服务注册地址)进入注入,而被调用的这些服务被注册在Zookeeper注册中心或Dubbo的注册中心进行了统一管理。
Zookeeper和Dubbo自带的注册中心,都属于服务端发现,用来代理所注册的这些服务,当服务调用者需要调用服务时,只需要通过服务的注册地址,就能找到对应的服务,并不需要关注服务是如何寻找的问题,或者服务名叫什么的问题,这些都被Zookeeper和Dubbo所代理了。下面是服务端发现的原理图:

下面,上干货github源码地址:
https://github.com/SpringEE/SpringBoot-dubbo
服务提供方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
## 使用通讯协议、暴露端口
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
## 注册中心
dubbo.registry.id = my-registry
dubbo.registry.address = N/A
服务消费方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
配置说明
spring.dubbo.application.name 应用名称
spring.dubbo.registry.address 注册中心地址
spring.dubbo.protocol.name 协议名称
spring.dubbo.protocol.port 协议端口
网友评论