源代碼已上傳github:https://github.com/zhsun1995/dubbo_test
一、服務端
1、導入依賴
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>dubbotest</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo_provider</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.5</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
</project>
2、ProviderService和ProviderServiceImpl
public interface ProviderService {
String sayHello(String name);
}
public class ProviderServiceImpl implements ProviderService {
public String sayHello(String name) {
return "Hello " + name;
}
}
3、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:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--當前項目在整個分佈式架構裏面的唯一名稱,計算依賴關係的標籤-->
<dubbo:application name="provider" owner="laosun">
<dubbo:parameter key="qos.enable" value="true"/>
<dubbo:parameter key="qos.accept.foreign.ip" value="false"/>
<dubbo:parameter key="qos.port" value="55555"/>
</dubbo:application>
<dubbo:monitor protocol="registry"/>
<!--dubbo這個服務所要暴露的服務地址所對應的註冊中心-->
<!--<dubbo:registry address="N/A"/>-->
<dubbo:registry address="N/A" />
<!--當前服務發佈所依賴的協議;webserovice、Thrift、Hessain、http-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--服務發佈的配置,需要暴露的服務接口-->
<dubbo:service
interface="com.laosun.service.ProviderService"
ref="providerService"/>
<!--Bean bean定義-->
<bean id="providerService" class="com.laosun.service.impl.ProviderServiceImpl"/>
</beans>
4、啓動類
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
public class Application {
public static void main( String[] args ) throws IOException, IOException {
//加載xml配置文件啓動
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
context.start();
System.in.read(); // 按任意鍵退出
}
}
注意添加log4j.xml。
運行後,
注意圖中dubbo的url,後續要用。
二、消費端
1、添加依賴
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>dubbotest</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo_consumer</artifactId>
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>dubbo_provider</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.5</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
</project>
2、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:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--當前項目在整個分佈式架構裏面的唯一名稱,計算依賴關係的標籤-->
<dubbo:application name="consumer" owner="sihai"/>
<!--dubbo這個服務所要暴露的服務地址所對應的註冊中心-->
<!--點對點的方式-->
<dubbo:registry address="N/A" />
<!--<dubbo:registry address="zookeeper://localhost:2181" check="false"/>-->
<!--生成一個遠程服務的調用代理-->
<!--點對點方式-->
<dubbo:reference id="providerService"
interface="com.laosun.service.ProviderService"
url="dubbo://10.4.16.50:20880/com.laosun.service.ProviderService"/>
<!--<dubbo:reference id="providerService"
interface="com.sihai.dubbo.provider.service.ProviderService"/>-->
</beans>
這裏用到了服務端產生的dubbo的url。
3、啓動類
package com.laosun.consumer;
import com.laosun.service.ProviderService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
public class Application {
public static void main( String[] args ) throws IOException {
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("consumer.xml");
context.start();
ProviderService providerService = (ProviderService) context.getBean("providerService");
String str = providerService.sayHello("laosun");
System.out.println(str);
System.in.read();
}
}
運行之後,出現
點對點方式搭建完成。
三、加入zookeeper作爲註冊中心
1、zookeeper安裝
(1)官網下載鏈接,本文使用的是3.4.14版本,下載後解壓。
(2)複製zookeeper-3.4.14\conf目錄下的zoo_sample.cfg並改名爲zoo.cfg,對其zoo.cfg配置進行修改:
dataDir=C:/ZHSUN/zookeeper-3.4.14/data
(3)cmd命令進入bin目錄,輸入命令:
zkServer.cmd
打開服務端
2、修改provider.xml
只需修改一句,將
<dubbo:registry address="N/A" />
修改爲:
<dubbo:registry address="zookeeper://localhost:2181" check="false"/>
如果使用zookeeper,則改爲:
<dubbo:registry protocol="zookeeper" address="192.168.11.129:2181,192.168.11.137:2181,192.168.11.138:2181"/>
3、修改consumer.xml
(1)同provider.xml一樣:
<dubbo:registry address="zookeeper://localhost:2181" check="false"/>
(2)使用zookeeper時,reference就不需要dubbo的url,改爲:
<dubbo:reference id="providerService"
interface="com.laosun.service.ProviderService"/>
4、運行兩個Application,注意要先開啓zookeeper服務。
同樣運行成功。
四、API配置方式
此方式不需要任何配置文件,只需要開啓zookeeper,運行下面兩個類即可。
1、服務端的啓動類
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.laosun.service.ProviderService;
import com.laosun.service.impl.ProviderServiceImpl;
import java.io.IOException;
public class AppApi {
public static void main(String[] args) throws IOException {
// 生成服務端對象
ProviderService providerService = new ProviderServiceImpl();
// 當前應用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("provider");
application.setOwner("laosun");
// 連接註冊中心
RegistryConfig registry = new RegistryConfig();
registry.setAddress("zookeeper://127.0.0.1:2181");
// 服務提供者協議配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(20880);
// ServiceConfig內部封裝了與註冊中心的連接,以及開啓服務端口,實例很重,正式應用需要進行緩存
// 服務者暴露服務配置
ServiceConfig<ProviderService> service = new ServiceConfig<ProviderService>();
service.setApplication(application);
service.setRegistry(registry);
service.setProtocol(protocol);
service.setInterface(ProviderService.class);
service.setRef(providerService);
service.setVersion("1.0.0");
// 暴露服務及註冊
service.export();
System.in.read();
}
}
2、消費端的啓動類
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.laosun.service.ProviderService;
import com.laosun.service.impl.ProviderServiceImpl;
public class AppApi {
public static void main(String[] args) {
ApplicationConfig application = new ApplicationConfig();
application.setName("consumer");
application.setOwner("laosun");
// 配置連接中心
RegistryConfig registry = new RegistryConfig();
registry.setAddress("zookeeper://127.0.0.1:2181");
// 引用遠程服務
ReferenceConfig<ProviderService> reference = new ReferenceConfig<ProviderService>(); //實例很重,需要進行緩存
reference.setApplication(application);
reference.setRegistry(registry);
reference.setInterface(ProviderService.class);
// 使用服務端
ProviderService providerService = new ProviderServiceImpl();
String str = providerService.sayHello("laosun");
System.out.println(str);
}
}
五、註解配置方式
1、給ProviderServiceImpl添加註解 @Service
2、組裝服務端
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.ProviderConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableDubbo(scanBasePackages = "com.laosun.service")
public class DubboProviderConfig {
@Bean
// 服務端信息配置
public ProviderConfig providerConfig() {
ProviderConfig config = new ProviderConfig();
config.setTimeout(1000);
return config;
}
@Bean
// 分佈式應用信息配置
public ApplicationConfig applicationConfig() {
ApplicationConfig config = new ApplicationConfig();
config.setName("provider");
return config;
}
@Bean
// 註冊中心信息配置
public RegistryConfig registryConfig() {
RegistryConfig config = new RegistryConfig();
config.setProtocol("zookeeper");
config.setAddress("127.0.0.1");
config.setPort(2181);
return config;
}
@Bean
// 使用dubbo協議配置
public ProtocolConfig protocolConfig() {
ProtocolConfig config = new ProtocolConfig();
config.setName("dubbo");
config.setPort(20881);
return config;
}
}
3、服務端啓動類
import com.laosun.config.DubboProviderConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.io.IOException;
public class AppAnnotation {
public static void main(String[] args) throws IOException {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DubboProviderConfig.class);
context.start();
System.in.read();
}
}
啓動成功:
4、消費端的service
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Component;
@Component
public class ConsumerAnnotationService {
@Reference
private ProviderService providerService;
public String sayHello(String name) {
return providerService.sayHello(name);
}
}
這裏注意Reference包不要引用錯了,不然會報NPE異常。
5、組裝消費者
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
@EnableDubbo(scanBasePackages = "com.laosun.service")
@ComponentScan(value = {"com.laosun.service"})
public class DubboConsumerConfig {
@Bean
// 應用配置
public ApplicationConfig applicationConfig() {
ApplicationConfig config = new ApplicationConfig();
config.setName("consumer");
Map<String, String> map = new HashMap<String, String>();
map.put("qos.enable", "true");
map.put("qos.accept.foreign.ip", "false");
map.put("qos.port", "33333");
config.setParameters(map);
return config;
}
@Bean
// 消費者配置
public ConsumerConfig consumerConfig() {
ConsumerConfig config = new ConsumerConfig();
config.setTimeout(5000);
return config;
}
@Bean
// 配置註冊中心
public RegistryConfig registryConfig() {
RegistryConfig config = new RegistryConfig();
config.setProtocol("zookeeper");
config.setAddress("127.0.0.1");
config.setPort(2181);
return config;
}
}
6、消費者啓動類
import com.laosun.config.DubboConsumerConfig;
import com.laosun.service.ConsumerAnnotationService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.io.IOException;
public class AppAnnotation {
public static void main(String[] args) throws IOException {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DubboConsumerConfig.class);
context.start();
ConsumerAnnotationService service = context.getBean(ConsumerAnnotationService.class);
String str = service.sayHello("laosun");
System.out.println(str);
System.in.read();
}
}
運行成功:
參考鏈接:https://segmentfault.com/a/1190000019896723