Dubbo 学习2 Dubbo-Admin及服务注册到Zookeeper
- 一、准备环境
- 1. 需要先安装好zookeeper
- 2. 下载编译dubbo-admin
- 3. 配置文件
- 4. 登陆系统
- 二、代码实现
- interface
- 生产者
- 消费者
- 三、问题处理
- 1. 看看主机名是不是 localhost.localdomain
- 2. 在hosts里添加记录
- 3. 要检查消费的ip是不是也使用了自身的私有ip
一、准备环境
1. 需要先安装好zookeeper
安装启动zookeeper后,输入jps,看到输出:
2. 下载编译dubbo-admin
检出 https://github.com/alibaba/dubbo ,
整个项目编译。有的文章讲只编译dubbo-admin就可以,但我没成功。
如果编译失败,多试几次。我试了很多次才成功了。
cd dubbo-master/
mvn install -Dmaven.test.skip=true
将生成的dubbo-admin-..*-SNAMPSHOT.war 部署到tomcat
3. 配置文件
部署后,修改WEB-INFO/dubbo.properties
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
4. 登陆系统
账号密码是root/root
二、代码实现
类似前一章的代码,只是服务注册方式不同
interface
DemoService
package com.alibaba.dubbo.demo;
public interface DemoService {
String sayHello(String name);
}
生产者
Provider.java
package com.alibaba.dubbo.demo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "dubbo-demo-provider.xml" });
context.start();
System.in.read();
}
}
DemoServiceImpl
package com.alibaba.dubbo.demo.provider;
import com.alibaba.dubbo.demo.DemoService;
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "Hello " + name;
}
}
dubbo-demo-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="demo-provider"/>
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<!-- <dubbo:registry address="multicast://224.5.6.7:1234"/> -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 向注册中心注册暴漏服务地址,注册服务 -->
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>
<bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/>
</beans>
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>
<groupId>com.cn.ali.dubbo.provider</groupId>
<artifactId>com.cn.ali.dubbo.provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>com.cn.ali.dubbo.provider</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.7</version>
</dependency>
</dependencies>
</project>
启动后,可以在dubbo admin-服务治理-服务,看到服务名称。
消费者
Consumer
package com.alibaba.dubbo.demo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Consumer {
public static void main(String[] args) throws Exception {
String s[] = System.getProperty("java.class.path").split(";");
for (String string : s) {
System.out.println(string);
}
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "dubbo-demo-consumer.xml" });
context.start();
DemoService demoService = (DemoService) context.getBean("demoService"); // obtain proxy object for remote invocation
String hello = demoService.sayHello("world"); // execute remote invocation
System.out.println(hello); // show the result
}
}
dubbo-demo-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="demo-consumer"/>
<!-- <dubbo:registry address="multicast://224.5.6.7:1234"/> -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 向注册中心订阅服务 -->
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService"/>
</beans>
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>
<groupId>com.cn.ali.dubbo.consumer</groupId>
<artifactId>com.cn.ali.dubbo.consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>com.cn.ali.dubbo.consumer</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.7</version>
</dependency>
</dependencies>
</project>
启动消费者,到dubbo-admin查看服务
三、问题处理
一个经常会遇到的问题,是dubbo的提供者ip 被注册为 127.0.0.1。 在dubbo-admin或进入zookeeper中可以看到提供者的信息。
处理方式是:
1. 看看主机名是不是 localhost.localdomain
如果是,则修改主机名。
hostnamectl
# 或 cat /etc/hostname
sudo hostnamectl set-hostname 要设置的主机名
hostnamectl
2. 在hosts里添加记录
运行dubbo服务提供者的ip 本机的主机名
3. 要检查消费的ip是不是也使用了自身的私有ip
如果是也修改hosts文件。