Dubbo是:
Dubbo结构与功能:
项目中部署的dubbo:
一台应用服务(application)内,既有对外提供服务(provider),也有依赖外部服务(consumer)。
provider涉及:registry/protocol/service/method/provider
consumer涉及:registry/reference/method/consumer
每台服务接口的信息,都会反映到monitor。以application的名称标识属于哪个应用。
简单搭建一个分布式项目,服务用dubbo来管理:
环境依赖:zookeeper,jdk1.8,tomcat7,dubbo-admin(控制台)
dubbo-admin安装:
一、新建一个简单的mvc项目 storePortal
pom文件除了引入mvc必备的依赖,还需要引入dubbo相关依赖
com.101tec
zkclient
0.3
org.apache.zookeeper
zookeeper
3.4.5
com.alibaba
dubbo
2.6.0
compile
spring
org.springframework
这个模块需要被外界访问,添加一个tomcat插件,或者打包后放到tomcat中
org.apache.tomcat.maven
tomcat7-maven-plugin
8080
/
web.xml配置
storePortal
index.html
index.jsp
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
SpringMVC
/
/index.jsp
dubbo配置方式有XML、peoperties、注解和api方式:
xml方式:
服务提供方:xml配置是将服务类交给spring的ioc容器,在由dubbo将服务开放成rpc服务,对外提供服务,所以在服务类上不需要加@Service注解
服务消费方:xml方式是将引用的服务交给spring的ioc容器,如果从容器中取得这个服务,需要用@Autowired注解
@Controller
public class IndexController implements ApplicationContextAware{
private ApplicationContext context;
@Autowired
private UserService userService;
@Autowired
private OrderService orderService;
}
这样就可以使用这个服务。
properties方式:是对xml方式的补充,如果xml配置里没有定义的配置信息,dubbo会从dubbo.properties这个文件中读取,如果xml中定义了相关信息,则peoperties的相关配置不会生效,properties文件的级别最低,一般将连接信息配置到properties文件,并且这个文件放在Resources文件夹下,起名dubbo.properties,dubbo会自动加载这个文件
# 应用名
dubbo.application.name=enjoyStore_properties
# 注册中心地址
dubbo.registry.address=zookeeper://192.168.244.2:2181
# 调用协议地址
dubbo.protocol.name=dubbo
dubbo.protocol.port=28080
注解方式配置dubbo
服务提供方:注解方式是在xml里加一个扫描包,扫描指定包下的类,如果发现类上加了@Service(这个注解是dubbo的注解)这个注解,那么就会将这个类交给spring的ioc容器管理,并将这个类开放成rpc服务,对外提供服务
服务消费方:注解方式是指定扫描包,扫描指定包下的类,发现哪个类的成员变量上加了@Reference注解(dubbo注解),就会将这个代理服务对象注入到这个类上,完成调用。这里不能用spring的注解,必须用dubbo的注解才能完成引用
@Controller
public class IndexController implements ApplicationContextAware{
private ApplicationContext context;
@Reference
private UserService userService;
@Reference
private OrderService orderService;
}
API方式:这种方式开发时不会使用,但是这种方式结构看起来会清晰一些,方便学习使用
服务提供方:
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import com.enjoy.service.VipUserService;
import com.enjoy.service.impl.VipUserServiceImpl;
import java.io.IOException;
public class StoreProvider {
public static void main(String[] args) throws IOException {
initDubbo();
}
public static void initDubbo() throws IOException {
// 当前应用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("StoreServerApi");
// 连接注册中心配置
RegistryConfig registry = new RegistryConfig();
registry.setProtocol("zookeeper");
registry.setAddress("192.168.244.2:2181");
// 服务提供者协议配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("rmi");
protocol.setPort(21880);
protocol.setThreads(100);
// 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
// 服务提供者暴露服务配置
// 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
ServiceConfig service = new ServiceConfig<>();
service.setApplication(application);
service.setRegistry(registry); // 多个注册中心可以用setRegistries()
service.setProtocol(protocol); // 多个协议可以用setProtocols()
service.setInterface(VipUserService.class);
service.setRef(new VipUserServiceImpl());
// 暴露及注册服务
service.export();
System.out.println("dubbo服务开启。。。。。。。。");
System.in.read();
}
}
服务消费方:
import com.alibaba.dubbo.config.*;
import com.enjoy.service.VipUserService;
import java.io.IOException;
public class StoreConsumer {
public static void main(String[] args) throws IOException {
// 当前应用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("StoreServerClientApi");
// 连接注册中心配置
RegistryConfig registry = new RegistryConfig();
registry.setProtocol("zookeeper");
registry.setAddress("192.168.244.2:2181");
// 服务提供者协议配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(20882);
protocol.setThreads(100);
// 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
// 引用远程服务
ReferenceConfig reference = new ReferenceConfig<>(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
reference.setApplication(application);
reference.setRegistry(registry); // 多个注册中心可以用setRegistries()
reference.setInterface(VipUserService.class);
// 和本地bean一样使用xxxService
VipUserService vipUserService = reference.get(); // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用
String ret = vipUserService.getVipDetail("123");
reference.destroy();
System.out.println(ret);
System.in.read();
}
}