1.Hello Dubbo

Hello Dubbo

工程结构

dubbo-demo
│
├─ dubbo-demo-api
│  └─ src/main/java
│     └─ qunar.tc.dubbo.demo.api
│        └─ HelloService
│  └─ pom.xml
│
├─ dubbo-demo-provider
│  └─ src/main/java
│     └─ qunar.tc.dubbo.demo.provider
│        └─ HelloServiceImpl
│  └─ src/main/resource
│     └─ spring-dubbo-provider.xml
│  └─ pom.xml
│
├─ dubbo-demo-consumer
│  └─ src/main/java
│     └─ qunar.tc.dubbo.demo.consumer
│        └─ HelloAction
│  └─ src/main/resource
│     └─ spring-dubbo-consumer.xml
│        └─ pom.xml
│
├─ pom.xml
建议采用同一个父工程的多个模块module
服务提供者 包含api和provider
api:存放服务接口(interface)和服务模型(pojo),服务异常(exception),一般为jar工程
provider:存放服务接口实现和暴露服务的配置,依赖api模块,一般为war工程
服务消费者
consumer:存放引用远程服务的配置和调用远程服务实现,依赖api模块,一般为war工程

maven依赖

dubbo-demo/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

	<modelVersion>4.0.0</modelVersion>

	<parent>
		<groupId>qunar.common</groupId>
		<artifactId>qunar-supom-generic</artifactId>
		<version>最新版本</version>
	</parent>

	<groupId>qunar.tc</groupId>
	<artifactId>dubbo-demo</artifactId>
	<version>1.0.0</version>
	<packaging>pom</packaging>

	<name>dubbo-demo</name>
	<url>http://wiki.corp.qunar.com/display/devwiki/dubbo</url>

	<modules>
		<module>dubbo-demo-api</module>
		<module>dubbo-demo-provider</module>
		<module>dubbo-demo-consumer</module>
	</modules>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<qunar.common.version>最新版本</qunar.common.version>
	</properties>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>${project.groupId}</groupId>
				<artifactId>dubbo-demo-api</artifactId>
				<version>${project.version}</version>
			</dependency>
		</dependencies>
	</dependencyManagement>
</project>
根据qunarmaven工程规范,所有工程需直接或间接继承 SuperPom。
<parent>
<groupId>qunar.common</groupId>
<artifactId>qunar-supom-generic</artifactId>
<version>最新版本</version>
</parent>
qunar maven工程规范参见:http://wiki.corp.qunar.com/pages/viewpage.action?pageId=18162048
SuperPom最新版本参见qunar nexus:http://svn.corp.qunar.com:8081/nexus/index.html#nexus-search;quick~qunar-supom-generic
SuperPom版本升级参见:http://wiki.corp.qunar.com/pages/viewpage.action?pageId=58046635
qunar.common.version的值参见:http://wiki.corp.qunar.com/pages/viewpage.action?pageId=49257776
common库版本为8.1.3以上的,一定记得到应用中心注册应用:http://pbservice.corp.qunar.com/my_app_create.htm
dubbo-demo-provider/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
		<artifactId>dubbo-demo</artifactId>
		<groupId>qunar.tc</groupId>
		<version>1.0.0</version>
		<relativePath>..</relativePath>
	</parent>

	<artifactId>dubbo-demo-provider</artifactId>
	<packaging>war</packaging>

	<name>dubbo demo provider</name>
	<url>http://wiki.corp.qunar.com/display/devwiki/dubbo</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>dubbo-demo-api</artifactId>
		</dependency>
		<dependency>
			<groupId>qunar.common</groupId>
			<artifactId>common-rpc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
		</dependency>
		<!-- log -->
		<!-- slf4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
		</dependency>
		<!--使用slf4j适配器将log4j接管 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>log4j-over-slf4j</artifactId>
		</dependency>
		<!-- 使用slf4j适配器将jcl接管 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
		</dependency>
		<!-- 使用slf4j适配器将jul接管 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jul-to-slf4j</artifactId>
		</dependency>
		<!-- logback -->
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
		</dependency>

		<!-- test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit-dep</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>
dubbo-demo-consumer/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
		<artifactId>dubbo-demo</artifactId>
		<groupId>qunar.tc</groupId>
		<version>1.0.0</version>
		<relativePath>..</relativePath>
	</parent>

	<artifactId>duubo-demo-consumer</artifactId>
	<packaging>war</packaging>

	<name>dubbo demo consumer</name>
	<url>http://wiki.corp.qunar.com/display/devwiki/dubbo</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>dubbo-demo-api</artifactId>
		</dependency>
		<dependency>
			<groupId>qunar.common</groupId>
			<artifactId>common-rpc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
		</dependency>
		<!-- log -->
		<!-- slf4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
		</dependency>
		<!--使用slf4j适配器将log4j接管 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>log4j-over-slf4j</artifactId>
		</dependency>
		<!-- 使用slf4j适配器将JCL接管 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
		</dependency>
		<!-- logback -->
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
		</dependency>

		<!-- test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit-dep</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>
provider和consumer都需要引api的包
建议不要直接依赖dubbo,而是需要依赖common-rpc

服务接口

定义服务接口:
public interface HelloService {
    public String sayHello(String name);
}
该接口需单独打包,在服务提供方和消费方共享

服务提供者

在服务提供方实现接口
HelloService
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name){
         return "hello:" + name;
    }
}
对服务消费方隐藏实现
用Spring配置声明暴露服务
spring-dubbo-provider.xml
<?xml version= "1.0" encoding= "UTF-8" ?>
<beans xmlns= "http://www.springframework.org/schema/beans"
xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans= "http://www.springframework.org/schema/beans"
xmlns:context ="http://www.springframework.org/schema/context"
xmlns:dubbo= "http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"
default-autowire= "byName">
    <context:property-placeholder location="classpath:dubbo-provider.properties" ignore-unresolvable="true" />
    <dubbo:application name ="dubbo-demo-provider" owner="kelly.li" organization="tcdev"/>
    <dubbo:registry protocol ="zookeeper" address="各环境zk地址" group="/demo/group/default" />
    <dubbo:protocol name="dubbo" port="20880"  />
    <dubbo:provider>
	<dubbo:parameter key="qloglevel" value="10" />
    </dubbo:provider>
    <dubbo:service interface="qunar.tc.dubbo.demo.api.HelloService" ref="helloService" version="1.0" timeout="3000"/>
    <bean id="helloService" class="qunar.tc.dubbo.demo.provider.HelloServceImpl"></bean>
</beans>
在根节点beans添加xml命名空间dubbo: xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
和dubbo标签遵循的规则地址:xsi:schemaLocation="...http://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"
dubbo:application 应用信息配置
@name 应用名称,用于注册中心计算应用间依赖关系。消费者和提供者应用名不要一样
@owner 应用负责人
@organization 组织名称(BU或部门),用于注册中心区分服务来源
dubbo:registry 注册中心配置
@protocol 注册中心地址协议,一般都写zookeeper
@address 注册中心服务器地址,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port  不同集群的注册中心,请配置多个<dubbo:registry>标签
一般都写zookeeper地址,各环境zookeeper地址如下:
dev l-zk1.plat.dev.cn6.qunar.com:2181
beta l-zk1.beta.cn6.qunar.com:2181,l-zk2.beta.cn6.qunar.com:2181,l-zk3.beta.cn6.qunar.com:2181
prod cn1 l-zk1.plat.cn1:2181,l-zk2.plat.cn1:2181,l-zk3.plat.cn1:2181,l-zk4.plat.cn1:2181,l-zk5.plat.cn1:2181
prod cn6 l-zk1.plat.cn6:2181,l-zk2.plat.cn6:2181,l-zk3.plat.cn6:2181,l-zk4.plat.cn6:2181,l-zk5.plat.cn6:2181
prod cn8 l-zk1.plat.cn8:2181,l-zk2.plat.cn8:2181,l-zk3.plat.cn8:2181,l-zk4.plat.cn8:2181,l-zk5.plat.cn8:2181
prod pay l-zk1.pay.cn1:2181,l-zk2.pay.cn1:2181,l-zk3.pay.cn1:2181
@group 注册服务根节点
dubbo:protocol 服务提供者协议配置
@name 协议名称,缺省dubbo
@port 服务端口 dubbo协议缺省端口为20880,如果配置为-1 或者 没有配置port,则会分配一个没有被占用的端口。
dubbo:provider 服务提供者缺省值配置
dubbo:parameter 选项参数配置
设置日志访问级别
common-core 8.0.8版本把dubbo访问日志分别记录在dubbo-access-consumer.yyyy-MM-dd.log和dubbo-access-provider.yyyy-MM-dd.log中
并将log分为不同的level(5, 8, 10),默认level为8: 输出请求的参数。
qloglevel < 5 无log输出
5 <= qloglevel < 8 输出简单的log(只有调用,不带参数和返回值)
8 <= qloglevel < 10 输出调用和参数
10 <= qloglevel 输出调用,参数和返回值
如果只在provider端配置了,则consumer端也会应用到provider的配置,consumer端可以覆盖provider的配置
dubbo中传递了敏感信息的,请将级别设置成5以下的数字。

设置netty版本
common-core 8.0.8 版本为dubbo增加netty4支持,因为netty4与netty3完全不兼容,所以我们没有直接替换掉netty3
使用netty还需要在pom文件中定义netty的版本为4
详情参见:http://wiki.corp.qunar.com/pages/viewpage.action?pageId=49257776#2.QunarCommon%E5%9F%BA%E7%A1%80%E7%B1%BB%E5%BA%93-20131213Version8.0.8

dubbo:service 服务提供者暴露服务配置
@interface 服务接口名
@ref 服务对象实现引用
@version 服务版本,建议使用两位数字版本,如:1.0,通常在接口不兼容时版本号才需要升级
@timeout 服务超时时间,建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚
通过 API 暴露服务
//设置应用信息,等价于<dubbo:application name="dubbo-demo-provider" owner="kelly.li" organization="tcdev" />
ApplicationConfig applicationConfig = new ApplicationConfig("dubbo-demo-provider");
applicationConfig.setOwner("kelly.li");
applicationConfig.setOrganization("tcdev");

//设置注册中心,等价于<dubbo:registry protocol="zookeeper" address="各环境zk地址" group="/demo/group/default" />
RegistryConfig registryConfig=new RegistryConfig("各环境zk地址");
registryConfig.setProtocol("zookeeper");
registryConfig.setGroup("/demo/group/default");

//设置服务提供者协议,等价于<dubbo:protocol name="dubbo" port="20880" />
ProtocolConfig protocolConfig=new ProtocolConfig("dubbo", 20880);

//配置提供方缺省信息,等价于<dubbo:provider><dubbo:parameter key="qloglevel" value="9" /></dubbo:provider>
ProviderConfig providerConfig = new ProviderConfig();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("qloglevel", "9");
providerConfig.setParameters(parameters);

//服务实现
HelloService helloService =new HelloServiceImpl();

//设置服务提供者暴露服务,等价于<dubbo:service interface="qunar.tc.dubbo.demo.api.HelloService" ref="helloService" version="1.0" timeout="3000" />
ServiceConfig<HelloService> serviceConfig=new ServiceConfig<HelloService>();
serviceConfig.setApplication(applicationConfig);
serviceConfig.setRegistry(registryConfig);
serviceConfig.setProtocol(protocolConfig);
serviceConfig.setProvider(providerConfig);
serviceConfig.setInterface(HelloService.class);
serviceConfig.setRef(helloService);
serviceConfig.setVersion("1.0");
serviceConfig.setTimeout(3000);
serviceConfig.export();
API类和配置标签一对一,比如:
com.alibaba.dubbo.config.ApplicationConfig 对应 <dubbo:application/>
com.alibaba.dubbo.config.RegistryConfig 对应 <dubbo:registry/>
com.alibaba.dubbo.config.ProtocolConfig 对应 <dubbo:protocol/>
com.alibaba.dubbo.config.ProviderConfig 对应 <dubbo:provider/>
com.alibaba.dubbo.config.ServiceConfig 对应 <dubbo:service/>
API属性与配置项一对一,比如:ApplicationConfig.setName("xxx") 对应 <dubbo:application name="xxx" />
ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口,请自行缓存,否则可能造成内存和连接泄漏

服务消费者

通过Spring配置引用远程服务
spring-dubbo-consumer.xml
<? xml version= "1.0" encoding= "UTF-8" ?>
<beans xmlns= "http://www.springframework.org/schema/beans"
xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans= "http://www.springframework.org/schema/beans"
xmlns:context ="http://www.springframework.org/schema/context"
xmlns:dubbo= "http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"
default-autowire= "byName">
    <context:property-placeholder location="classpath:dubbo.properties" ignore-unresolvable="true" />
    <dubbo:application name="dubbo-demo-consumer" owner="kelly.li" organization="tcdev"/>
    <dubbo:registry protocol="zookeeper" address="各环境zk地址" group="/demo/group/default" />
    <dubbo:consumer>
		<dubbo:parameter key="qloglevel" value="10" />
    </dubbo:consumer>
    <dubbo:reference id="helloService" interface="qunar.tc.dubbo.demo.api.HelloService" version="1.0" check="false" />
    <bean id="helloAction" class="qunar.tc.demo.consumer.HelloAction" ></ bean>
</beans>
在根节点beans添加xml命名空间dubbo: xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
和dubbo标签遵循的规则地址:xsi:schemaLocation="...http://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"
dubbo:application 应用信息配置
@name 应用名称,用于注册中心计算应用间依赖关系。消费者和提供者应用名不要一样
@owner 应用负责人
@organization 组织名称(BU或部门),用于注册中心区分服务来源 
dubbo:registry 注册中心配置
@protocol 注册中心地址协议,一般都写zookeeper
@address 注册中心服务器地址,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port  不同集群的注册中心,请配置多个<dubbo:registry>标签
一般都写zookeeper地址,各环境zookeeper地址如下:
dev l-zk1.plat.dev.cn6.qunar.com:2181
beta l-zk1.beta.cn6.qunar.com:2181,l-zk2.beta.cn6.qunar.com:2181,l-zk3.beta.cn6.qunar.com:2181
prod cn1 l-zk1.plat.cn1:2181,l-zk2.plat.cn1:2181,l-zk3.plat.cn1:2181,l-zk4.plat.cn1:2181,l-zk5.plat.cn1:2181
prod cn6 l-zk1.plat.cn6:2181,l-zk2.plat.cn6:2181,l-zk3.plat.cn6:2181,l-zk4.plat.cn6:2181,l-zk5.plat.cn6:2181
prod cn8 l-zk1.plat.cn8:2181,l-zk2.plat.cn8:2181,l-zk3.plat.cn8:2181,l-zk4.plat.cn8:2181,l-zk5.plat.cn8:2181
prod pay l-zk1.pay.cn1:2181,l-zk2.pay.cn1:2181,l-zk3.pay.cn1:2181
@group 注册根路径
dubbo:consumer 服务消费者缺省值配置
dubbo:parameter 选项参数配置
设置日志访问级别
common-core 8.0.8版本把dubbo访问日志分别记录在dubbo-access-consumer.yyyy-MM-dd.log和dubbo-access-provider.yyyy-MM-dd.log中
并将log分为不同的level(5, 8, 10),默认level为8: 输出请求的参数。
qloglevel < 5 无log输出
5 <= qloglevel < 8 输出简单的log(只有调用,不带参数和返回值)
8 <= qloglevel < 10 输出调用和参数
10 <= qloglevel 输出调用,参数和返回值
如果只在provider端配置了,则consumer端也会应用到provider的配置,consumer端可以覆盖provider的配置
dubbo中传递了敏感信息的,请将级别设置成5以下的数字。
设置netty版本
common-core 8.0.8 版本为dubbo增加netty4支持,因为netty4与netty3完全不兼容,所以我们没有直接替换掉netty3
使用netty还需要在pom文件中定义netty的版本为4
详情参见:http://wiki.corp.qunar.com/pages/viewpage.action?pageId=49257776#2.QunarCommon%E5%9F%BA%E7%A1%80%E7%B1%BB%E5%BA%93-20131213Version8.0.8
dubbo:reference 服务消费者引用服务配置
@id 服务引用bean id
@interface 服务接口名
@version 服务版本,与服务提供者的版本一致
@check 启动时检查提供者是否存在,true报错,false忽略
通过API 获得远程服务
// 设置应用信息,等价于<dubbo:application name="dubbo-demo-provider" owner="kelly.li" organization="tcdev"/>
ApplicationConfig applicationConfig = new ApplicationConfig("dubbo-demo-consumer");
applicationConfig.setOwner("kelly.li");
applicationConfig.setOrganization("tcdev");

// 设置注册中心,等价于<dubbo:registry protocol="zookeeper" address="各环境zk地址" group="/demo/group/default" />
RegistryConfig registryConfig = new RegistryConfig("各环境zk地址");
registryConfig.setProtocol("zookeeper");
registryConfig.setGroup("/demo/group/default");

// 设置消费者缺省信息,等价于<dubbo:consumer><dubbo:parameter key="qaccesslog" value="9" /></dubbo:consumer>
ConsumerConfig consumerConfig = new ConsumerConfig();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("qaccesslog", "9");
consumerConfig.setParameters(parameters);

// 设置服务消费者引用服务配置,等价于<dubbo:reference id="helloService" interface="qunar.tc.dubbo.demo.api.HelloService" version="1.0" check="false" />
ReferenceConfig<HelloService> referenceConfig = new ReferenceConfig<HelloService>();
referenceConfig.setApplication(applicationConfig);
referenceConfig.setRegistry(registryConfig);
referenceConfig.setConsumer(consumerConfig);
referenceConfig.setInterface(HelloService.class);
referenceConfig.setVersion("1.0");
referenceConfig.setCheck(false);
HelloService helloService = referenceConfig.get();
API类和配置标签一对一,比如:
com.alibaba.dubbo.config.ApplicationConfig 对应 <dubbo:application/>
com.alibaba.dubbo.config.RegistryConfig 对应 <dubbo:registry/>
com.alibaba.dubbo.config.ProtocolConfig 对应 <dubbo:protocol/>
com.alibaba.dubbo.config.ProviderConfig 对应 <dubbo:provider/>
com.alibaba.dubbo.config.ReferenceConfig对应 <dubbo:reference/>
API属性与配置项一对一,比如:ApplicationConfig.setName("xxx") 对应 <dubbo:application name="xxx" />
ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接,请自行缓存,否则可能造成内存和连接泄漏
调用远程服务
HelloAction
public class HelloAction {
    private HelloService helloService;

    public void setHelloService(HelloService helloService) {
        this.helloService = helloService;
    }

    public String sayHello(String name) {
        return helloService.sayHello(name);
    }
}
测试远程调用服务
TestHelloAction
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring-dubbo-consumer.xml" })
public class TestHelloAction {
    @Autowired
    private HelloAction helloAction;
    @Test
    public void testSayHello() throws Exception {
        String result=helloAction.sayHello("kelly.li");
        System.out.println(result);
    }
}
  1. 2015-04-16

    王腾wteng says:
      大家注意,spring-dubbo-consumer.xml文件中声明的"helloAction"的bean必须加上构造函数,不然其中的"helloServic...

    大家注意,spring-dubbo-consumer.xml文件中声明的"helloAction"的bean必须加上构造函数,不然其中的"helloService"回报空指针的异常

  2. 04-30

    张伟zww says:
      这个结构图是有错误吧! 新人刚开始学习dubbo


    这个结构图是有错误吧! 新人刚开始学习dubbo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值