建立一个Maven项目,在这个Maven项目下创建两个子模板(服务者、消费者)
XML方式:
服务者:
1.引入依赖:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.16</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.7</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>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
</dependencies>
2.创建一个实体类:
@Data
public class User implements Serializable{
private Integer id;
private String name;
private String email;
private Integer age;
}
3.创建一个接口和它的实现类:
public interface UserService {
User getUserById();
}
public class UserServiceImpl implements UserService {
public User getUserById() {
User user=new User();
user.setAge(18);
user.setEmail("2098900@qq.com");
user.setId(2);
user.setName("小明");
return user;
}
}
4.创建xml配置文件(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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd
">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="user-service-provider" />
<dubbo:monitor protocol="registry"/>
<!--使用zookeeper注册中心-->
<dubbo:registry address="zookeeper://localhost:2181" check="false"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.service.UserService" ref="userService" />
<!-- 和本地bean一样实现服务 -->
<bean id="userService" class="com.service.impl.UserServiceImpl" />
</beans>
5.配置启动类:
public class Provider {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("provider.xml");
context.start();
System.in.read();//按任意键退出
}
}
消费者:
1.导入依赖,和服务者导入的依赖相同
2.创建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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="user-service-consumer" >
<dubbo:parameter key="qos.port" value="33333" />
</dubbo:application>
<!--使用zookeeper注册中心 -->
<dubbo:registry address="zookeeper://localhost:2181" check="false"/>
<!-- 生成远程服务代理,可以和本地bean一样使用userService -->
<!--zookeeper方式-->
<dubbo:reference id="userService" interface="com.service.UserService"/>
</beans>
3.创建启动类:
public class Consumer {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("consumer.xml");
context.start();
UserService userService= (UserService) context.getBean("userService");
User user= userService.getUserById();
System.out.println(user);
}
}
注解方法:
服务者:
同上xml方法的步骤(但不需创建xml文件):
有几点改动:
1.在接口的实现类上添加注解:
import com.alibaba.dubbo.config.annotation.Service; //注意Service导入的是dubbo的
@Service(timeout = 5000)
public class UserServiceImpl implements UserService {
public User getUserById() {
User user=new User();
user.setAge(18);
user.setEmail("2098900@qq.com");
user.setId(2);
user.setName("小明");
return user;
}
}
2.创建一个配置类:
//通过 @Configuration 将 DubboConfiguration 中所有的 @Bean 通过 Java Config 的方式组装出来并注入给 Dubbo 服务,也就是标注有 @Service 的类
@Configuration
//通过 @EnableDubbo 指定在某包下扫描所有标注有 @Service 的类
@EnableDubbo(scanBasePackages = "com.service.impl")
public class DubboConfiguration {
@Bean
public ProviderConfig providerConfig(){
ProviderConfig providerConfig=new ProviderConfig();
providerConfig.setTimeout(1000);
return providerConfig;
}
@Bean
public ApplicationConfig applicationConfig(){
ApplicationConfig applicationConfig=new ApplicationConfig();
applicationConfig.setName("dubbo-annotation-provider");
applicationConfig.setOwner("Cathy");
return applicationConfig;
}
@Bean
public RegistryConfig registryConfig(){
RegistryConfig registryConfig=new RegistryConfig();
registryConfig.setProtocol("zookeeper");
registryConfig.setAddress("localhost");
registryConfig.setPort(2181);
return registryConfig;
}
@Bean
public ProtocolConfig protocolConfig(){
ProtocolConfig protocolConfig=new ProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(20880);
return protocolConfig;
}
}
3.修改启动类:
public class Provider {
public static void main(String[] args) throws IOException {
AnnotationConfigApplicationContext configApplicationContext=new AnnotationConfigApplicationContext(DubboConfiguration.class);
configApplicationContext.start();;
System.in.read();
}
}
消费者:
也同上xml方法的步骤(但不需创建xml文件),有几处改动
1.创建一个service:
@Component
public class ConsumerAnnotationService {
//通过 @Reference 引用服务端提供的类,然后通过方法调用这个类的方式,给消费端提供接口
@Reference
private UserService userService;
public User getById(){
return userService.getUserById();
}
}
2.创建一个配置类:
@Configuration
@EnableDubbo(scanBasePackages = "com.service")
@ComponentScan(value = "com.service")
public class ConsumerConfiguration {
@Bean // #1 服务消费者信息配置
public ConsumerConfig consumerConfig() {
ConsumerConfig consumerConfig=new ConsumerConfig();
consumerConfig.setTimeout(1000);
return consumerConfig;
}
@Bean // #2 分布式应用信息配置
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("dubbo-annotation-consumer");
Map<String, String> stringStringMap = new HashMap<String, String>();
stringStringMap.put("qos.enable","true");
stringStringMap.put("qos.accept.foreign.ip","false");
stringStringMap.put("qos.port","33333");
applicationConfig.setParameters(stringStringMap);
return applicationConfig;
}
@Bean // #3 注册中心信息配置
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setProtocol("zookeeper");
registryConfig.setAddress("localhost");
registryConfig.setPort(2181);
return registryConfig;
}
@Bean // #4 使用协议配置,这里使用 dubbo
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(20882);
return protocolConfig;
}
}
3.创建启动类:
在 main 方法中通过启动一个 Spring Context,从其中查找到组装好的 Dubbo 的服务消费者,并发起一次远程调用。
public class Consumer {
public static void main(String[] args) throws IOException {
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
context.start();
ConsumerAnnotationService consumerAnnotationService=context.getBean(ConsumerAnnotationService.class);
User user=consumerAnnotationService.getById();
System.out.println(user);
System.in.read();
}
}
结果: