1.我们要实现什么
Provider: 暴露服务的服务提供方,我这里创建名为news-provider的Module来实现。
Consumer: 调用远程服务的服务消费方,我这里创建名为news-consumer的Module来实现。
Registry: 服务注册与发现的注册中心,使用Zookeeper来实现,具体实现可参考我之前文章。
Monitor: 统计服务的调用次调和调用时间的监控中心,Dubbo客户端,Dubbo客户端安装可参考我之前文章。
Container: 服务运行容器。
Provider提供服务,并上传到Register,Monitor可以对上传上来的服务进行管理,Consumer可以通过Register拿到Provider提供的服务的相关信息,进行消费
2.具体实现
1.创建一个普通Maven工程dubboservice,有3个子模块,服务接口模块news-ervice,定义了服务的规范;服务提供者模块news-provider,依赖服务接口模块,实现其规范,提供服务;服务消费者模块news-consumer,依赖服务接口模块,通过服务接口从注册中心拿到对应的服务。
工程pom.xml
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
<!--zkclient:简化原生zk操作-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!--curator:ZK连接管理、SESSION失效等一些异常问题处理-->
<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>
news-provider和news-consumer模块的pom.xml
<dependencies>
<dependency>
<groupId>org.staybug</groupId>
<artifactId>news-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
2.news-service模块定义服务接口
package org.staybug.service;
import java.util.List;
public interface NewService {
List<String> getTop100News();
}
3.news-provider模块实现服务接口,对外提供服务
在resources目录下创建spring-news-provider.xml配置文件,配置如下信息
<dubbo:application name="news-provider" owner="zxs" organization="staybug"></dubbo:application>
<!--定义注册中心地址-->
<dubbo:registry protocol="zookeeper" address="192.168.2.10:2181"></dubbo:registry>
<!--定义服务本地占用端口,默认端口为20880-->
<dubbo:protocol name="dubbo" port="10084"></dubbo:protocol>
<!--通过dubbo发布服务
服务提供者暴露服务配置
interface:服务接口名
ref:服务实现引用-->
<dubbo:service interface="org.staybug.service.NewService" ref="newsServiceImpl"/>
<bean id="newsServiceImpl" class="org.staybug.service.impl.NewServiceImpl"/>
实现服务接口
public class NewServiceImpl implements NewService {
public List<String> getTop100News() {
List<String> newsTitles = new ArrayList<String>();
newsTitles.add("您的文章已进入人工审核阶段,请您耐心等待,如若24小时内未审核通过,请联系客服,谢谢。");
return newsTitles;
}
}
对外提供服务
public class ProviderApp {
public static void main(String[] args){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-news-provider.xml");
//启动Spring容器
context.start();
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
4.news-consumer模块进行消费
在resources目录下创建spring-news-consumer.xml配置文件,配置如下信息
<!--配置消费者的应用信息-->
<dubbo:application name="news-consumer" owner="zxs" organization="staybug"/>
<!--定义消费者消费服务需要访问的注册中心地址,和生产者相同-->
<dubbo:registry protocol="zookeeper" address="192.168.2.10:2181"/>
<!--引用生产者服务,服务消费者引用服务配置
1.从注册中心中找到接口服务名为org.staybug.service.NewService的生产者服务地址:
dubbo://192.168.159.1:10080/org.staybug.service.NewService?anyhost=true
&application=news-provider&dubbo=2.6.2&generic=false&interface=org.staybug.service.NewService
&methods=getTop100News&organization=staybug&owner=zxs&pid=6996&side=provider×tamp=1588247739218
2.解析生产服务地址,获取ip、端口、接口名、方法名
3.选择其中一个生产者,发起RPC调用,返回结果
-->
<dubbo:reference interface="org.staybug.service.NewService" id="newsService"/>
进行消费
public class ConsumerApp {
public static void main(String[] args){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-news-consumer.xml");
NewService newService= context.getBean(NewService.class);
while (true){
System.out.println();
List<String> top100News = newService.getTop100News();
for (String newItem : top100News){
System.out.println(newItem);
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
5,控制台就会打印如下信息
来源:oschina
链接:https://my.oschina.net/staybug/blog/4268250