搭建项目之前可以先去我的第一篇微服务项目搭建之前的一些工作准备,中间件等的设置,这里是连续创建,用的都是之前创建好的基础,所以直接更着走了,第一篇微服务链接地址:https://blog.csdn.net/gaofengyan/article/details/85156496
1. 新建project smbms-springboot-dubbo
创建普通maven工程项目:
工程建好如下:
检查maven设置(快捷键:CTRL+alt+S):
注意,我这里没有选择自动导包功能,所以后面每一步都需要自己手动刷新,避免了idea对jar包快速下载造成的仓库留存太多错误而对项目的影响。
2. 新建module smbms-springboot-dubbox-common(公共module)
同样创建普通maven的公共module:
公共模块如下,并去掉父类继承操作:
2.1)增加 json 插件包 jar包 配置并手动更新:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.12</version>
</dependency>
2.2)编写实体类pojo与service接口
User.java实体类:
package org.kgc1803.smbms.pojo;
import java.io.Serializable;
public class User implements Serializable {
private Integer id;
private String userCode;
private String userName;
private String password;
public User(){
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
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;
}
}
Order.java实体类:
package org.kgc1803.smbms.pojo;
import org.codehaus.jackson.annotate.JsonProperty;
import java.io.Serializable;
public class Order implements Serializable {
//@JsonProperty实体类可以自动转化为 json 类对象数据的属性
@JsonProperty
private Integer id;
@JsonProperty
private Integer ownerUserId;
@JsonProperty
private String productName;
@JsonProperty
private Double price;
@JsonProperty
private Integer amount;
public Order(){
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getOwnerUserId() {
return ownerUserId;
}
public void setOwnerUserId(Integer ownerUserId) {
this.ownerUserId = ownerUserId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Integer getAmount() {
return amount;
}
public void setAmount(Integer amount) {
this.amount = amount;
}
}
OrderService.java接口:
package org.kgc1803.smbms.service;
import org.kgc1803.smbms.pojo.Order;
import java.util.List;
public interface OrderService {
//查看所有
List<Order> findList(Integer id);
}
UserService.java接口:
package org.kgc1803.smbms.service;
import org.kgc1803.smbms.pojo.User;
/**
* 用户接口
*/
public interface UserService {
//登陆
User loginUser(User u);
}
2.3)编写完后这里需要用maven打成jar包并发布到注册中仓库
控制台出现下面情况说明打包和发布成功:
查看仓库的架包是否发布成功:
3. 新建module smbms-springboot-dubbox-provider(提供者module)
按照上面的方式创建提供者模块并对pom.xml文件做初修改:
3.1)pom.xml配置文件增加以下相应的jar包 配置
<?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>org.kgc1803</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>smbms-springboot-dubbox-provider</artifactId>
<!--定义变量名-->
<properties>
<java.version>1.8</java.version>
<spring.boot.version>1.5.10.RELEASE</spring.boot.version>
<mybaties.spring.boot.version>1.3.2</mybaties.spring.boot.version>
<mysql.driver.version>5.1.46</mysql.driver.version>
</properties>
<dependencies>
<!--公共包-->
<dependency>
<groupId>org.kgc1803</groupId>
<artifactId>smbms-springboot-dubbox-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--spring-boot-starter 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<!--mysql-connector-java-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.driver.version}</version>
</dependency>
<!--mybaties-spring-boot-starter-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybaties.spring.boot.version}</version>
</dependency>
<!--spring-boot-starter-test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<!-- *************************************以下是spring+dubbox的jar包******************************** -->
<!--zookeeper 包-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<!-- zkclient 包-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.8</version>
</dependency>
<!-- dubbo 包-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.4</version>
</dependency>
<!--hessian 包-->
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.7</version>
</dependency>
<!--dubbox rest 风格包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-rpc-rest</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.1</version>
</dependency>
</dependencies>
</project>
注意,按照前面的微服务配置方式,是一样的jar包,只是在遇到jar包版本跨越太大就会出现冲突,并且有很多jar包是重复的,这时候我们需要耐心调整jar包的版本,尽量统一并兼容。以上是在之前的微服务项目的jar包中将版本归一后的的,现在再做一些jar去重,精简后的配置文件如下,并且这里并没有完全达到全部去重的效果:
<?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>org.kgc1803</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>smbms-springboot-dubbox-provider</artifactId>
<!--定义变量名-->
<properties>
<java.version>1.8</java.version>
<spring.boot.version>1.5.10.RELEASE</spring.boot.version>
<mybaties.spring.boot.version>1.3.2</mybaties.spring.boot.version>
<mysql.driver.version>5.1.46</mysql.driver.version>
</properties>
<dependencies>
<!--公共包-->
<dependency>
<groupId>org.kgc1803</groupId>
<artifactId>smbms-springboot-dubbox-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--spring-boot-starter 依赖-->
<!--mysql-connector-java-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.driver.version}</version>
</dependency>
<!--mybaties-spring-boot-starter-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybaties.spring.boot.version}</version>
</dependency>
<!--spring-boot-starter-test-->
<!-- *************************************以下是spring+dubbox的jar包******************************** -->
<!--zookeeper 包-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<!-- zkclient 包-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.8</version>
</dependency>
<!-- dubbo 包-->
<!--hessian 包-->
<!--dubbox rest 风格包 -->
<!--dubbo-springboot-starter 包-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.1</version>
</dependency>
</dependencies>
</project>
3.2)编写service 实现类、dao-mapper
UserMapper.java dao-mapper类
package org.kgc1803.smbms.dao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.kgc1803.smbms.pojo.User;
import org.springframework.stereotype.Repository;
/**
* @Mapper 表示该接口是一个注解mybaties接口
* @Repository 表示注入一个dao实现类
*/
@Mapper
@Repository
public interface UserMapper {
//登陆
@Select("SELECT id,userCode,userName\n" +
"FROM smbms_user\t\n" +
"WHERE userCode=#{userCode} and password=#{password}")
@Results(id="userMap",value = {
@Result(property = "id",column = "id",javaType =Integer.class ),
@Result(property = "userName",column = "userName",javaType =String.class),
@Result(property = "userCode",column = "userCode",javaType =String.class)
})
User loginUser(User u);
}
UserServiceImpl.java 实现类:
package org.kgc1803.smbms.service;
import com.alibaba.dubbo.config.annotation.Service;
import org.kgc1803.smbms.dao.UserMapper;
import org.kgc1803.smbms.pojo.User;
import javax.annotation.Resource;
/**
* springboot的注解功能实现了dubbox的配置文件部分功能,如发布服务:
* <dubbo:service protocol="dubbo" interface="cn.kgc1803.smbms_common.service.UserService" ref="userService" timeout="10000" />
*/
@Service(timeout = 10000)
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
public User loginUser(User u) {
return userMapper.loginUser(u);
}
}
3.3)在spring boot中配置发布dubbox 服务,spring boot精简了更多的配置文件,大多已经加入到注解里面实现,只有部分需要配置文件实现。
1)在application.properties配置文件配置
#dataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/dubbo-smbms
spring.datasource.username=root
spring.datasource.password=123456
#设置提供者本次发布的应用名称
dubbo.application.name=smbms_provider123
dubbo.registry.address=zookeeper://127.0.0.1:2181
#dubbo扫描包 发布服务所在的包
dubbo.scan.base-packages=org.kgc1803.smbms.service
#服务器发布的端口号
server.port=21001
3.4)新建提供者的发布main窗口SmbmsProviderApplication.java 通过这个main窗口将提供者注入到注册中心,提供服务;重点是这里要注意这个main窗口创建的位置,他必须与dao-mapper和service实现类同级或高一级,才能在启动时扫描到所有类:
package org.kgc1803.smbms;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication
public class SmbmsProviderApplication {
public static void main(String[] args){
//项目以web方式启动
new SpringApplicationBuilder(SmbmsProviderApplication.class).web(false).run();
}
}
4. 新建module smbms-springboot-dubbox-consume(消费者module)
按照上面的方法创建消费者模块:
在main下面创建webapp/WEB-INF/view目录,以便创建web的jsp页面。
4.1)增加jar包 修改配置;手动添加spring boot的启动插件:
<?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>org.kgc1803</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>smbms-springboot-dubbox-consume</artifactId>
<packaging>war</packaging>
<!--定义变量名-->
<properties>
<java.version>1.8</java.version>
<spring.boot.version>1.5.10.RELEASE</spring.boot.version>
<mybaties.spring.boot.version>1.3.2</mybaties.spring.boot.version>
<mysql.driver.version>5.1.46</mysql.driver.version>
</properties>
<dependencies>
<!--公共包-->
<dependency>
<groupId>org.kgc1803</groupId>
<artifactId>smbms-springboot-dubbox-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--spring mvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<!--dubbo-spring-boot-starter-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--zookeeper 包-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<!-- zkclient 包-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.8</version>
</dependency>
<!--jsp 页面插件jar包-->
<!--ideal 内置tomcat不支持jsp,增加jsp jar包-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>8.5.27</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jsp-api</artifactId>
<version>8.5.27</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--spring boot的启动插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.0.RELEASE</version>
</plugin>
</plugins>
</build>
</project>
4.2)编写 controller层
package org.kgc1803.smbms.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import org.kgc1803.smbms.pojo.User;
import org.kgc1803.smbms.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpSession;
@Controller
@RequestMapping("/user")
public class UserController {
@Reference
private UserService userService;
//登陆
@RequestMapping(value = "/dologin.html",method = RequestMethod.POST)
public String dologin(User user, HttpSession session){
User u = userService.loginUser(user);
if (u!=null){//登陆失败
session.setAttribute("session_user",u);
return "index";
}else {//登陆成功
return "login";
}
}
}
4.3)在spring boot中配置订阅dubbox服务
1)在application.properties配置文件配置
#spring mvc
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
#服务器
server.port=8083
server.tomcat.uri-encoding=UTF-8
#spring 字符集
spring.http.encoding.charset=UTF-8
spring.http.encoding.force=true
spring.http.encoding.enabled=true
#dubbo
dubbo.application.name=smbms_consume_123
dubbo.registry.address=zookeeper://127.0.0.1:2181
4.4)新建消费者的main窗口 SmbmsConsumeApplication.java:
package org.kgc1803.smbms;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SmbmsConsumeApplication {
public static void main(String[] args){
SpringApplication.run(SmbmsConsumeApplication.class);
}
}
注意:消费者的启动并不使用这个窗口启动,同样用右边的窗口spring boot run启动。
login.jsp
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2018/12/26
Time: 15:30
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登陆</title>
</head>
<body>
<form method="post" action="${pageContext.request.contextPath}/user/dologin.html">
用户名:<input type="text" name="userCode">
密码:<input type="password" name="password">
<input type="submit" value="登陆">
</form>
</body>
</html>
index.jsp
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2018/12/24
Time: 15:00
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<script type="text/javascript" src="${pageContext.request.contextPath}/statics/js/jquery-3.3.1.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/statics/js/order.js"></script>
<body>
登陆成功,欢迎你:${session_user.userName}<br>
订单列表:
<ul>
</ul>
</body>
</html>
5.启动测试
5.1)启动 SmbmsProviderApplication.java将提供者发布到注册中心(前提必须是启动zookeeper和tomcat服务脚本):
如下内容说明启动成功:
如果这里启动不了,则需要修改maven配置,如下红框处:
链接之前的配置:http://localhost:8080/dubbo-admin-2.8.4/
5.2)用spring boot 启动消费者
连接端口号:http://localhost:8082/
输入数据库的登陆信息验证:
跳转成功,到达首页,并取到值:
以上基础配置加测试就算成功了。有待更新!