1 背景
公司服务器坏了,闲着没事干。
github地址:https://github.com/lmmmmmm/MyWeb.git
2 环境
Ubuntu16.04、JDK 10、Zookeeper-3.4.10、Spring Boot 2.1、Maven 3.3.9
3 配置zookeeper
1、 从这里下载Zookeeper。下载后解压zookeeper。进入conf目录,复制一份zoo_sample.cfg重命名为zoo.cfg。主要命令如下
tar -zxf zookeeper-3.4.10.tar.gz
cd zookeeper-3.4.10/conf
cp zoo_sample.cfg zoo.cfg
2、进入bin目录,执行下面命令即可启动zk、停止zk、查看zk。
cd ../bin/
bash zkServer.sh start //启动zk,当出现Starting zookeeper ... STARTED 就说明启动成功了
bash zkServer.sh status //查看状态,当出现Mode: standalone 就证明正在运行
bash zkServer.sh stop //停止zk
4 创建dubbo应用
说明:本应用基于maven,没有maven请自行安装。
项目结构如下所示:
该应用一共有三个模块。
1 dubbo-api:提供接口供dubbo-prodiver和dubbo-consumer使用。
2 dubbo-prodiver:实现api模块提供的接口,注册dubbo服务,给dubbo-consumer提供服务调用。
3 dubbo-consumer:调用接口完成消费。
4.1 dubbo-api
项目结构如下所示:
创建一个简单的maven工程。pom文件如下:
<?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>MyWeb</artifactId>
<groupId>com.lm</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.lm</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>10</maven.compiler.source>
<maven.compiler.target>10</maven.compiler.target>
</properties>
</project>
这里面的坑是,当我创建完api模块后,编译该模块时始终报下面的错误。
[ERROR] 不再支持源选项 5。请使用 6 或更高版本。
[ERROR] 不再支持目标选项 1.5。请使用 1.6 或更高版本。
后来百度后发现是pom文件中没有加下面的配置导致的。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>10</maven.compiler.source>
<maven.compiler.target>10</maven.compiler.target>
</properties>
创建一个User类
package com.lm.user;
/**
* @author lming.41032@gmail.com
* @date 18-11-3 下午11:29
*/
public class User {
private Integer id;
private String userName;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
创建一个UserService
package com.lm.user.service;
import com.lm.user.User;
/**
* @author lming.41032@gmail.com
* @date 18-11-3 下午11:30
*/
public interface UserService {
Boolean login(String username, String password);
User register(String userName, String password);
}
dubbo-api模块到此基本结束。
4.2 dubbo-prodiver
项目结构如下所示:
创建一个Spring Boot工程,可以从这里使用spring Initializr初始化一个Spring Boot项目,也可以用IDEA初始化一个Spring Boot项目。别忘了加入dubbo-api的依赖。dubbo-prodiver项目pom如下所示:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lm</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.lm</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建一个UserService的实现UserServiceImpl,这里只是一个简单的实现。
package com.lm.dubboprovider.user.impl;
import com.lm.user.User;
import com.lm.user.service.UserService;
import org.springframework.stereotype.Service;
/**
* @author lming.41032@gmail.com
* @date 18-11-4 下午2:55
*/
@Service
public class UserServiceImpl implements UserService {
private static final String USERNAME = "lm";
private static final String PASSWORD = "123";
@Override
public Boolean login(String userName, String password) {
if (USERNAME.equals(userName) && PASSWORD.equals(password)) {
return true;
}
return false;
}
@Override
public User register(String userName, String password) {
User user = new User();
user.setId(1);
user.setUserName(userName);
user.setPassword(password);
return user;
}
}
创建完成后在该模块下resource创建一个dubbo目录,在dubbo目录中创建dubbo-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="dubbo-provider"/>
<!-- 注册中心配置,使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" timeout="60000"/>
<!-- 协议配置,由服务提供方指定,消费方被动接受-->
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:service interface="com.lm.user.service.UserService" ref="userService"/>
<!-- 具体的实现bean,id与上面的ref要一致-->
<bean id="userService" class="com.lm.dubboprovider.user.impl.UserServiceImpl"/>
</beans>
该文件中 可能下面的文件找不到,应为这些域名阿里已经不在使用了
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo
打开设置,找到Schemas and DTDs
选择右上角的绿色的+号,然后添加,这里File可以在本地maven仓库中的dubbo jar包中的文件,也可以自己离线下载在添加。
配置完成后,需要在启动类上引入该文件:
最后在配置一下tomcat的端口:在resource中的application文件中添加,我这里是使用yml格式来设置的。
dubbo-provider 模块到此基本配置完成。
4.3 dubbo-consumer模块
项目结构如下所示:
同dubbo-provider模块一样, 创建一个Spring Boot项目。同样的,也要依赖dubbo-api模块,pom文件如下所示:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lm</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.lm</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建完成后,建立一个UserRestController来调用Userservice,这里只是一个简单的测试。
package com.lm.dubboconsumer.user;
import com.lm.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* @author lming.41032@gmail.com
* @date 18-11-5 下午5:10
*/
@RestController
@RequestMapping("user")
public class UserRestController {
@Autowired
private UserService userService;
@GetMapping("login")
public String login(HttpServletRequest request) {
String userName = request.getParameter("username");
String password = request.getParameter("password");
Boolean flag = userService.login(userName, password);
if (flag) {
return "登录成功!";
} else {
return "登录失败!";
}
}
}
同样的,在resource中创建一个dubbo文件夹再创建一个dubbo-consumer文件。
<?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="dubbo-consumer"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181" timeout="60000"/>
<dubbo:reference id="userService" interface="com.lm.user.service.UserService"/>
</beans>
然后在启动类上引入该文件
最后在配置一下tomcat端口:
dubbo-consumer模块到此也配置完成了。
5 启动服务
先启动zookeeper,然后在启动dubbo-provider项目,最后启动dubbo-consumer项目,访问
总结
一直在使用dubbo,但是自己从来没有搭建过。本次搭建,主要学到了Spring Boot 是怎么配置dubbo的,dubbo服务是怎么注册的,注册后又是怎么调用的。简单的记录一下。