大家好,又见面了,我是你们的朋友全栈君。
dubbo是一个远程服务调用的分布式框架。让我们告别了webservice的wsdl调用方式,取而代之的是服务注册和服务消费模式。下面对dubbo的组成做一个简单的解释,为的是读者能更好的理解下面的代码 dubbo在结构上一共分为4个部分。 1 .provider:服务的提供者,将服务注册到Registry中,供外界调用。 2 .container:服务容器 ( 加载dubbo配置文件,将配置文件中的服务部署运行 ) 3 .registry:服务的注册中心(本篇使用zookeeper) 3 .consumer:服务的消费者,消费提供者注册的服务。 4 .monitor:统计中心(主要统计服务的调用次数和调用时间)
上述4部分之间的关系为:(原图引自:springboot整合dubbo)
关于dubbo的详细介绍可以查看 dubbo的详细解释。文章写的很好,想详细了解dubbo,可以阅读这篇帖子。
首先我们在相应的提供者工程中需要导入dubbo的依赖
代码语言:javascript复制<!--springboot和dubbo整合-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.7</version>
<exclusions>
<exclusion>
<groupId>slf4j-log4j12</groupId>
<artifactId>org.slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--zookeeper原生API,经常会发生session expire异常。此依赖可以解决这个问题-->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
引入依赖之后,开始写提供者代码。
定义一个bean
代码语言:javascript复制public class UserCredenceInfoVO implements Serializable {
private String uciFlowno;
private String uniqueid;
private String loginName;
private String credenceClass;
private String credenceAppend;
private String credenceStatus;
}
dubbo是靠接口发布服务,写一个测试接口,用来发布。
代码语言:javascript复制public interface UserCredenceReadService {
public UserInfoVO findUserInfoByLoginName(UserCredenceInfoVO userCredenceInfoInfoVO);
}
接口对应的实现类为:
代码语言:javascript复制@Service
public class UserCredenceReadServiceImpl implements UserCredenceReadService {
@Override
public UserInfoVO findUserInfoByLoginName(UserCredenceInfoVO userCredenceInfoInfoVO) {
try {
UserInfoVO userInfoVO = new UserInfoVO();
String loginName = userCredenceInfoInfoVO.getLoginName();
System.out.println(loginName);
}
}
上面的@Service注解是Spring的注解,不是dubbo的。
之后,我们开始写xml文件,注册服务。
代码语言:javascript复制<!-- 提供方应用信息,用于计算依赖关系 -->
<?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="meteor-provider" />
<dubbo:registry protocol="zookeeper" address="zookeeper://177.177.177.177:2182?backup=177.177.177.178:2182,177.177.177.179:2182" />
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:service interface="cn.org.meteor.comp.service.userinfo.UserCredenceReadService" ref="userCredenceReadServiceImpl" version="1.0.0" />
</beans>
zk使用的是集群模式,如果是单机模式。zk地址写法为:
代码语言:javascript复制<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" client="zkclient" />
xml定义好之后,我们要在springboot的主类上扫描这个配置文件。
代码语言:javascript复制@EnableAutoConfiguration
@SpringBootApplication
@ComponentScan(basePackages = "cn.org.meteor.comp")
@ImportResource("classpath:dubbo-provider.xml")
public class Application {
/**
* 核心启动类
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
关于如何搭建一个简单的springboot工程,可以看我之前的博客 搭建一个简单的springboot版的ssm框架 上面的工作完成后,我们的提供者就定义好了。 然后通过dubbo控制台服务治理模块就可以看到我们注册的服务。
dubbo的控制台,服务是一个dubbo-admin的war包。 如果需要下载这个war包,可以去这个博客,里面分享了一个地址可以下载。 dubbo-admin.war 下载
提供者搞定,下面我们开始写消费者,测试我们的提供者服务。
消费者消费服务,也需要接口支持,推荐的做法是将提供者的接口发布到nexus上。然后,消费者直接引用,很方便。
定义消费者xml文件
代码语言:javascript复制<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="meteor-consumer"/>
<!--注册中心地址-->
<dubbo:registry protocol="zookeeper" address="zookeeper://177.177.177.177:2182?backup=177.177.177.178:2182,177.177.177.179:2182" />
<dubbo:annotation package="cn.org.meteor.comp.service.userinfo" />
<dubbo:reference interface="cn.org.meteor.comp.service.userinfo.UserCredenceReadService" id="userCredenceReadService" version="1.0.0" timeout="5000" />
</beans>
dubbo的超时时间默认为1000ms,这里定义为5000ms
在主类中扫描这个文件
代码语言:javascript复制@SpringBootApplication
@ImportResource("classpath:dubbo-consumer.xml")
public class Application {
/**
* 核心启动类
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
然后写一个测试类,测试我们是否可以调通发布的服务
代码语言:javascript复制@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class TestUserCredence {
@Autowired
UserCredenceReadService userCredenceReadService;
@Test
public void test_userCredence() {
UserCredenceInfoVO userCredenceInfoVO = new UserCredenceInfoVO();
userCredenceInfoVO.setLoginName("wyy");
userCredenceReadService.findUserInfoByLoginName(userCredenceInfoVO);
}
}
执行test方法,然后查看服务提供端是否打印了我们设置的登录名。 如果有什么问题,欢迎留言。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/126777.html原文链接:https://javaforall.cn