需求:根据登录这信息搭建一个passport
项目架构方式:SOA 面向服务架构
技术选型:Maven,SpringMVC,Spring,springboot,Mybatis,Dubbo,Zookeeper,MySQL
用户登录与商品上架微服务架构图解:
![]() |

![]()
#关联mapper中的application-mapper.yml
spring:
profiles:
active: mapper
#配置zookepper注册中心
dubbo:
application:
name: dubbo_provider
registry:
address: zookeeper://192.168.160.129:2181?backup=192.168.160.129:2182,192.168.160.129:2183 #zookeeper集群
# address: zookeeper://192.168.160.129:2181 #单机版zookeeper注册中心
protocol:
name: dubbo
一:实现provider模块注册服务
1:依赖
<?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>dubbo</artifactId>
<groupId>com.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>provider</artifactId>
<dependencies>
<!-- 依赖pojo-->
<dependency>
<artifactId>mapper</artifactId>
<groupId>com.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 依赖api-->
<dependency>
<artifactId>api</artifactId>
<groupId>com.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<!--web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
2:application.yml配置文件
dubbo:
registry:
address: zookeeper://192.168.245.129:2181?backup=192.168.245.129:2182,192.168.245.129:2183 #这是实现多集群的地址:伪集群
protocol:
name: dubbo #dubbo默认端口是20880
port: -1 #给与-1的值如果端口被占用为递增直至不冲突为止
application:
name: dubbo_provider #暴露当前名在zookeeper中显示
#关联mapper
spring:
profiles:
active: mapper
#指定端口
server:
port: 8081
3:providerApplication启动类
package com;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication//交给spring容器管理
@EnableDubbo//实现Dubbo的配置,功能类似与xml配置文件中的各种配置,在该注解中可以实现类似的功能,通过绑定的方式来实现。
@MapperScan("com.dubbo.mapper")//扫描mapper包
public class providerApp {
public static void main(String[] args) {
SpringApplication.run(providerApp.class,args);
}
}
4:实现api共同接口-->在serviceImp层:
package com.dubbo.provider.Service.ServiceImp;
import com.dubbo.api.TuserApi;
import com.dubbo.mapper.TuserMapper;
import com.dubbo.pojo.Tuser;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
//要选择dubbo的@Service
@Service
public class TuserImp implements TuserApi {
//注入mapper
@Autowired
private TuserMapper tuserMapper;
//通过TuserApi实现这个共同接口去mapper层查询后台数据库是否存在此类对象,返回对象结果
@Override
public Tuser login(Tuser tuser) {
return tuserMapper.login(tuser);
}
}
二:实现api模块,创造一个接口平台提供注册服务,订阅服务功能
1:依赖
<?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>dubbo</artifactId>
<groupId>com.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>api</artifactId>
<dependencies>
<!-- 依赖pojo-->
<dependency>
<artifactId>pojo</artifactId>
<groupId>com.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
2:创造公共接口
package com.dubbo.api;
import com.dubbo.pojo.Tuser;
public interface TuserApi {
Tuser login(Tuser tuser);
}
三:实现passport模块订阅服务
1:依赖
<?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>dubbo</artifactId>
<groupId>com.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>passport</artifactId>
<dependencies>
<!-- 依赖mapper-->
<dependency>
<artifactId>mapper</artifactId>
<groupId>com.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 依赖api-->
<dependency>
<artifactId>api</artifactId>
<groupId>com.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- jsp解析器 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!--视图解析器依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- spring-session -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo-version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${curator-version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator-version}</version>
</dependency>
</dependencies>
</project>
2:application.yml配置文件
# 端口
server:
port: 8080
# 视图解析器
spring:
mvc:
view:
suffix: .jsp
prefix: /WEB-INF/jsp/
#关联mapper
profiles:
active: mapper
dubbo:
registry:
address: zookeeper://192.168.245.129:2181?backup=192.168.245.129:2182,192.168.245.129:2183 #这是实现多集群的地址:伪集群
protocol:
name: dubbo #dubbo默认端口是20880
port: -1 #给与-1的值如果端口被占用为递增直至不冲突为止
application:
name: dubbo_consumer #暴露当前名在zookeeper中显示
3:passportApplication启动类
package com;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication//交给spring器管理
@EnableDubbo//实现Dubbo的配置,功能类似与xml配置文件中的各种配置,在该注解中可以实现类似的功能,通过绑定的方式来实现。
@MapperScan("com.dubbo.mapper")//扫描
public class passprotApp {
public static void main(String[] args) {
SpringApplication.run(passprotApp.class,args);
}
}
4:实现api接口把远程服务放在本地-->在service层:
package com.dubbo.passport.Service;
import com.dubbo.api.TuserApi;
public interface TuserService extends TuserApi {
}
5:实现api共同接口-->在serviceImp层:
package com.dubbo.passport.Service.ServiceImp;
import com.dubbo.api.TuserApi;
import com.dubbo.passport.Service.TuserService;
import com.dubbo.pojo.Tuser;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
//注意这里是spring的service
@Service
public class TuserServiceImp implements TuserService {
//远程订阅服务
@Reference
private TuserApi tuserApi;
//通过远程订阅的api接口里面的方法把前端页面提交的数据放进去比对返回一个tuser对象
@Override
public Tuser login(Tuser tuser) {
return tuserApi.login(tuser);
}
}
6创建controller控制器
package com.dubbo.passport.controller;
import com.dubbo.passport.Service.ServiceImp.TuserServiceImp;
import com.dubbo.pojo.Tuser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
@Controller//交给spring管理
public class TuserController {
//注入service层
@Autowired
private TuserServiceImp tuserServiceImp;
//前端跳转
@RequestMapping("/loginUser")
public String login(Tuser tuser, HttpSession session){
//把前端对象放进service层比对
Tuser user = tuserServiceImp.login(tuser);
//得到结果为空抛异常,对象存在-->重定向到成功页面
if (user==null){
throw new IllegalArgumentException("用户名或密码错误");
}
//对象存在上传session捕获登陆者信息
session.setAttribute("user",user);
return "redirect:/success";
}
}
7创建一个登陆页面
在webapp-->WEB-INF-->jsp下
后缀为 .jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String path = request.getContextPath(); //获取当前工程的根目录
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; //项目url根目录
%>
<html>
<head>
<base href="<%=basePath%>"> <!--这个让此文件下的路径都相对于当前工程开始-->
<title>登录</title>
</head>
<body>
<H3>用户提交数据</H3>
<form action="loginUser">
<%-- 名字需要一一对应--%>
用户名:<input type="text" name="uname"/><br/>
密码:<input type="password" name="pwd"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
8创建一个动态捕捉jsp的控制器PageController
package com.dubbo.passport.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class PageController {
@RequestMapping("/{Page}")
public String showPage(@PathVariable String Page){
return Page;
}
}
9创建一个登陆跳转成功jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String path = request.getContextPath(); //获取当前工程的根目录
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; //项目url根目录
%>
<html>
<head>
<base href="<%=basePath%>"> <!--这个让此文件下的路径都相对于当前工程开始-->
<title>Title</title>
</head>
<body>
欢迎${user.uname}, 归来!
</body>
</html>
四:实现pojo实体类模块
1:创建pojo类:注意与数据库一致
package com.dubbo.pojo;
import java.io.Serializable;
public class Tuser implements Serializable {
private int uid;
private String pwd;
private String uname;
@Override
public String toString() {
return "Tuser{" +
"pwd='" + pwd + '\'' +
", uid=" + uid +
", uname='" + uname + '\'' +
'}';
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
}
五:实现mapper层模块
1:依赖
<?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>dubbo</artifactId>
<groupId>com.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mapper</artifactId>
<dependencies>
<!-- 依赖pojo-->
<dependency>
<artifactId>pojo</artifactId>
<groupId>com.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</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>
<scope>runtime</scope>
</dependency>
<!--阿里的德鲁伊连接池,性能很高,推荐使用-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
</dependencies>
</project>
2:application.yml配置文件 注意这是linux上的数据库
#数据库的连接参数
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.245.129:3306/dubbo?serverTimezone=UTC&characterEncoding=utf-8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource #使用阿里的德鲁伊高性能连接池
# type: org.springframework.jdbc.datasource.DriverManagerDataSource #mybatis中自带的数据库连接池
3:创建mapper接口通过注解方式与数据库比对信息,返回对象
package com.dubbo.mapper;
import com.dubbo.pojo.Tuser;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
@Repository//将这个类交给spring容器管理
public interface TuserMapper {
@Select("select * from tuser where uname = #{uname} and pwd = #{pwd}")
Tuser login(Tuser tuser);
}


927

被折叠的 条评论
为什么被折叠?



