一.Dubbo
下载Dubbo:Dubbo官网
安装Dubbo:
进入源码文件所在总目录下,进行编译打包
执行以下命令
mvn install -Dmaven.test.skip=true
打好包后会在Dubbo-admin文件项目中生成一个target的目录,在该目录下找到打包到的【dubbo-admin-0.0.1-SNAPSHOT.jar】文件,如下图所示:
在该目录下使用CMD,使用一下命令启动Dubbojar包.
Java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
二.Zookerper
zookerper下载:Zookerper下载地址
进入到 D:\work\apache-zookeeper-3.8.0-bin\conf目录下,把zoo_sample.cfg拷贝一份重命名成zoo.cfg
自己设置一下dir位置以及添加第三行
添加ZK环境变量
完成后就可以在bin目录下启动zkserver.cmd
访问本地7001端口.登录名 root,密码 root.
三.搭建微服务
3.1.搭建公共模块
将一些提供者和消费都需要使用的内容我们可以存放在公共模块中,比如pojo相关内容和对外暴露的service接口,以及一些工具类的相关内容等。
这些信息在provider中需要,在consumer中同样是需要的,如果隐藏的话,那么在这些模块中都需要编写,比较麻烦,
所以直接将这些内容放在公共模块中,这样需要的话直接引入即可。
项目架构
主要Pojo及接口
Chat类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Chat implements Serializable {
private long chat_id;
private String chat_status;
private String chat_name;
private Integer chat_type;
private String create_time;
private long creator_id;
private long to_id;
private Boolean is_deleted;
private String last_send_time;
private String last_message;
}
User类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private long user_id;
private String username;
private String password;
private Boolean online_status;
private String create_time;
private Integer user_status;
private List<Chat> chatList;
}
ChatService接口
public interface ChatService {
List<Chat> findChatByUser(long user_id);
}
UserService 接口
public interface UserService {
User findUserById(long user_id);
User findInfoById(long user_id);
}
依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
3.2.创建provider
Provider 是服务的提供者,可以理解为mvc开发模式中的M, 就是从service以后的所有的内容都写在这个项目下。
模块直接使用springboot的模板创建,因为是一个提供者,所以需要将mybatis相关的内容和数据库相关的内容也一起勾上。
项目架构
项目代码
数据库连接配置类
@Configuration
public class DruidConfig {
/*
将自定义的 Druid数据源添加到容器中,不再让 Spring Boot 自动创建
绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource从而让它们生效
@ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中
前缀为 spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中
*/
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource() {
return new DruidDataSource();
}
}
ChatMapper 接口
@Mapper
@Repository
public interface ChatMapper {
List<Chat> findChatByUser(@Param("user_id") long user_id);
}
使用@DubboService将服务暴露给dubbo
@Service
@DubboService//将服务暴露给dubbo
public class ChatServiceImpl implements ChatService {
@Autowired
private ChatMapper chatMapper;
@Override
public List<Chat> findChatByUser(long user_id) {
System.out.println("被调用了findChatByUser");
return chatMapper.findChatByUser(user_id);
}
}
启动类 (启动类添加@EnableDubbo注解)
@SpringBootApplication
@MapperScan("com.chat.mapper")
@EnableDubbo
public class ChatServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ChatServiceApplication.class, args);
}
}
mapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chat.mapper.ChatMapper">
<select id="findChatByUser" resultType="Chat">
SELECT *FROM chat WHERE creator_id = #{user_id} UNION SELECT *FROM chat WHERE to_id = #{user_id}
</select>
</mapper>
配置文件(配置数据库连接以及注册到zookerper上)
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/study?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
server:
port: 8881
mybatis:
type-aliases-package: com.api.entity
mapper-locations: mappers/*.xml
dubbo:
application:
name: chat-service
registry:
protocol: zookeeper
address: 127.0.0.1:2181
protocol:
name: dubbo
port: 20884
依赖(导入common模块)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 数据库-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<dependency><!--zookerper版本一定要匹配! -->
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
<version>2.7.8</version>
</dependency>
<!--这个是分包api的maven依赖-->
<dependency>
<groupId>com.dubbo</groupId>
<artifactId>data-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
3.3.搭建consumer
和构建提供者provider一样的方式去构建调用者consumer。
项目架构
主要代码
数据库配置类
@Configuration
public class DruidConfig {
/*
将自定义的 Druid数据源添加到容器中,不再让 Spring Boot 自动创建
绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource从而让它们生效
@ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中
前缀为 spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中
*/
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource() {
return new DruidDataSource();
}
}
controller类
@RequestMapping("/user")
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/queryUser")
public String queryUser(long user_id) {
return JSONObject.toJSONString(userService.findUserById(user_id));
}
@RequestMapping("/queryUserChat")
public String queryUserChat(long user_id) {
return JSONObject.toJSONString(userService.findInfoById(user_id));
}
}
Usermapper接口
@Mapper
@Repository
public interface UserMapper {
User findUserById(@Param("user_id")long user_id);
}
Userservice实现类 (添加@DubboReference注解找到在provider中暴露的chatservice)
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@DubboReference
private ChatService chatService;
@Override
public User findUserById(long user_id) {
System.out.println("调用了findUserById");
return userMapper.findUserById(user_id);
}
@Override
public User findInfoById(long user_id) {
System.out.println("调用了findUserById");
User user=userMapper.findUserById(user_id);
System.out.println("调用了远程服务findChatByUser");
user.setChatList(chatService.findChatByUser(user_id));
return user;
}
}
启动类(启动类添加@EnableDubbo注解)
@SpringBootApplication
@MapperScan("com.user.mapper")
@EnableDubbo
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
Mapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.user.mapper.UserMapper">
<select id="findUserById" resultType="User">
SELECT * FROM user WHERE user_id = #{user_id}
</select>
</mapper>
配置文件
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/study?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
server:
port: 8882
mybatis:
type-aliases-package: com.api.entity
mapper-locations: mappers/*.xml
dubbo:
application:
name: user-service
registry:
protocol: zookeeper
address: 127.0.0.1:2181
protocol:
name: dubbo
port: 20885
依赖(添加公共模块的依赖)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 数据库-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<dependency><!--zookerper版本一定要匹配! -->
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
<version>2.7.8</version>
</dependency>
<!--这个是分包api的maven依赖-->
<dependency>
<groupId>com.dubbo</groupId>
<artifactId>data-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
3.4数据库表设计
四.查看Dubbo界面
可以看到chatService和Userservice已经被注册上来了.
暴露出来的chatService接口也被发现
五.调用consumer服务从而实现实现远程调用provider服务的接口
调用localhost:8882/user/queryUserChat?user_id=1
实现微服务的调用