041 用户注册功能01--搭建微服务和数据验证功能

1.创建用户中心微服务

用户搜索到自己心仪的商品,接下来就要去购买,但是购买必须先登录。所以接下来我们编写用户中心,实现用户的登录和注册功能。

用户中心的提供的服务:

  • 用户的注册
  • 用户登录

这里我们暂时先实现基本的:注册和登录功能。

因为用户中心的服务其它微服务也会调用,因此这里我们做聚合。

leyou-user:父工程,包含2个子工程:

  • leyou-user-interface:实体及接口
  • leyou-user-service:业务和服务

(1)创建父module

(2)创建leyou-user-interface

在leyou-user下,创建module:

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>leyou-user</artifactId>
        <groupId>lucky.leyou.user</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>lucky.leyou.user</groupId>
    <artifactId>leyou-user-interface</artifactId>

</project>

(3)创建leyou-user-service

注意:创建leyou-user-service过程与创建leyou-user-interface过程类似

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>leyou-user</artifactId>
        <groupId>lucky.leyou.user</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>lucky.leyou.user</groupId>
    <artifactId>leyou-user-service</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- mybatis启动器 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <!-- 通用Mapper启动器 -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>lucky.leyou.user</groupId>
            <artifactId>leyou-user-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>

</project>

启动器类:

package lucky.leyou;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@EnableDiscoveryClient
@MapperScan("lucky.leyou.user.mapper")
public class LeyouUserApplication {

    public static void main(String[] args) {
        SpringApplication.run(LeyouUserApplication.class, args);
    }
}

配置:

server:
  port: 8085
spring:
  application:
    name: user-service
  datasource:
      url: jdbc:mysql://localhost:3306/leyou?serverTimezone=UTC&useSSL=false
      username: root
      password: plj824
      driver-class-name: com.mysql.jdbc.Driver
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    lease-renewal-interval-in-seconds: 5
    lease-expiration-duration-in-seconds: 15

mybatis:
  type-aliases-package: lucky.leyou.user.domain

父工程leyou-user的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>leyou</artifactId>
        <groupId>lucky.leyou.parent</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>lucky.leyou.user</groupId>
    <artifactId>leyou-user</artifactId>
    <packaging>pom</packaging>
    <modules>
        <module>leyou-user-interface</module>
        <module>leyou-user-service</module>
    </modules>

</project>

(4)添加网关路由

我们修改leyou-gateway,添加路由规则,对leyou-user-service进行路由:

server:
  port: 10010
spring:
  application:
    name: leyou-gateway
eureka:
  client:
    registry-fetch-interval-seconds: 5
    service-url:
      defaultZone: http://localhost:10086/eureka
zuul:
  prefix: /api # 路由路径前缀
  routes:
      item-service: /item/**  # 商品微服务的映射路径
      search-service: /search/** #搜索微服务
      user-service: /user/**  #用户微服务

2.后台功能准备

(1)数据结构

CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL COMMENT ‘用户名‘,
  `password` varchar(32) NOT NULL COMMENT ‘密码,加密存储‘,
  `phone` varchar(20) DEFAULT NULL COMMENT ‘注册手机号‘,
  `created` datetime NOT NULL COMMENT ‘创建时间‘,
  `salt` varchar(32) NOT NULL COMMENT ‘密码加密的salt值‘,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COMMENT=‘用户表‘;

数据结构比较简单,因为根据用户名查询的频率较高,所以我们给用户名创建了索引

(2)基本代码

<1>实体类

需要用到实体类注解,pom文件中添加依赖

<dependencies>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.6</version>
        </dependency>
    </dependencies>

实体类:

package lucky.leyou.user.domain;

import com.fasterxml.jackson.annotation.JsonIgnore;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

@Table(name = "tb_user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;// 用户名

    @JsonIgnore
    private String password;// 密码

    private String phone;// 电话

    private Date created;// 创建时间

    @JsonIgnore //对象序列化为json字符串时,忽略该属性
    private String salt;// 密码的盐值

    public Long getId() {
        return id;
    }

    public void setId(Long 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;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

    public String getSalt() {
        return salt;
    }

    public void setSalt(String salt) {
        this.salt = salt;
    }
}

注意:为了安全考虑。这里对password和salt添加了注解@JsonIgnore,这样在json序列化时,就不会把password和salt返回

<2>mapper

package lucky.leyou.user.mapper;

import lucky.leyou.user.domain.User;
import tk.mybatis.mapper.common.Mapper;

public interface UserMapper extends Mapper<User> {
}

<3>Service

package lucky.leyou.user.service;

import lucky.leyou.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
}

<4>Controller

package lucky.leyou.user.controller;
import lucky.leyou.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    @Autowired
    private UserService userService;

}

3.数据验证功能

(1)接口说明

实现用户数据的校验,主要包括对:手机号、用户名的唯一性校验。

接口路径:

GET /check/{data}/{type}

参数说明:

返回结果:

返回布尔类型结果:

  • true:可用
  • false:不可用

状态码:

  • 200:校验成功
  • 400:参数有误
  • 500:服务器内部异常

(2)controller

因为有了接口,我们可以不关心页面,所有需要的东西都一清二楚:

  • 请求方式:GET
  • 请求路径:/check/{param}/{type}
  • 请求参数:param,type
  • 返回结果:true或false
/**
     * 校验数据是否可用
     * @param data 占位符参数
     * @param type 占位符参数
     * @return
     */
    @GetMapping("check/{data}/{type}")
    public ResponseEntity<Boolean> checkUserData(@PathVariable("data") String data, @PathVariable(value = "type") Integer type) {
        Boolean boo = this.userService.checkUser(data, type);
        if (boo == null) {
            //参数不合法
            return ResponseEntity.badRequest().build();
        }
        return ResponseEntity.ok(boo);
    }

(3)service

/**
     * 实现用户数据的校验,主要包括对:手机号、用户名的唯一性校验。
     * @param data 占位符参数
     * @param type
     * @return
     */
    public Boolean checkUser(String data, Integer type) {
        User record = new User();
        switch (type) {
            case 1:
                record.setUsername(data);
                break;
            case 2:
                record.setPhone(data);
                break;
            default:
                return null;
        }
        return this.userMapper.selectCount(record) == 0;
    }

(4)测试

<1>启动nginx

<2>开启微服务

我们在数据库插入一条假数据:

然后在浏览器调用接口,测试:

不经过网关,直接通过端口访问

经过网关,通过Nginx代理直接通过端口访问

原文地址:https://www.cnblogs.com/luckyplj/p/11625105.html

时间: 2024-08-03 15:17:04

041 用户注册功能01--搭建微服务和数据验证功能的相关文章

SpringCloud从入门到进阶(四)——使用SpringBoot搭建微服务

内容 SpringBoot整合SpringCloud的Eureka.Zuul等组件,快速实现简单易懂且具有服务熔断.负载均衡的分布式架构1.0,体验微服务的魅力. 版本 IDE:IDEA 2017.2.2 x64 JDK:1.8.0_171 manve:3.3.3 SpringBoot:1.5.9.RELEASE SpringCloud:Dalston.SR1 适合人群 ?Java开发人员 说明 转载请说明出处:SpringCloud从入门到进阶(四)--使用SpringBoot搭建微服务 参考

【译文】用Spring Cloud和Docker搭建微服务平台

by Kenny Bastani Sunday, July 12, 2015 转自:http://www.kennybastani.com/2015/07/spring-cloud-docker-microservices.html This blog series will introduce you to some of the foundational concepts of building a microservice-based platform using Spring Cloud

【3分钟就会系列】使用Ocelot+Consul搭建微服务吧!

原文:[3分钟就会系列]使用Ocelot+Consul搭建微服务吧! 一.什么Ocelot? API网关是一个服务器,是系统的唯一入口.API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式.从面向对象设计的角度看,它与外观模式类似.API网关封装了系统内部架构,为每个客户端提供一个定制的API.它可能还具有其它职责,如身份验证.监控.负载均衡.缓存.请求分片与管理.静态响应处理. Ocelot 是一

Actuator + Prometheus + Grafana搭建微服务监控平台

[TOC] 前言 关于Actuator: 对Spring Boot监控能力有过了解的小伙伴都应该知道Spring Boot Actuator这个子项目,它为应用提供了强大的监控能力.从Spring Boot 2.x开始,Actuator将底层改为Micrometer,提供了更强.更灵活的监控能力.Micrometer是一个监控门面,可以类比成监控界的 Slf4j .借助Micrometer,应用能够对接各种监控系统,例如本文所要介绍的:Prometheus 关于Prometheus : Prom

kubernetes微服务扩容与新功能版本的发布

微服务不需要像普通服务那样成为一种独立的功能或者独立的资源.定义中称,微服务是需要与业务能力相匹配,这种说法完全正确.不幸的是,仍然意味着,如果能力模型粒度的设计是错误的,那么,我们就必须付出很多代价.如果你阅读了Fowler的整篇文章,你会发现,其中的指导建议是非常实用的.在决定将所有组件组合到一起时,开发人员需要非常确信这些组件都会有所改变,并且规模也会发生变化.服务粒度越粗,就越难以符合规定原则.服务粒度越细,就越能够灵活地降低变化和负载所带来的影响.然而,利弊之间的权衡过程是非常复杂的,

springCloud搭建微服务集群+Zuul服务器端负载均衡

概述 最近研究了一下springCloud的微服务集群,主要用到了SpringCloud的服务发现和服务器端负载均衡,所有的项目都是用的springboot,可以和springCloud无缝对接. 技术选型服务发现:eureka负载均衡:zuul 实现Eureka集群(eurekaServer):8001.8002.8003服务提供方(eurekaClient):9001.9002服务端负载均衡服务:9100 1.新建工程eureka服务器,用idea创建springboot项目,引入eurek

从零搭建微服务之架构概述

一.应用背景 随着计算技术的进步,内存.CPU.磁盘等资源不再是稀缺的,计算机作为应用程序的载体从单服务器转变为多服务器,集中计算演化为分布式计算.原有的“巨石”应用难以适应业务的发展速度,可扩展.自适应的能力不足,程序员面对着数以万计的源代码文件抓耳挠腮(O M G!),越来越多的工程师渴望小而美.易于扩展的架构体系,微服务应运而生.自2005年首次由Peter Rodgers提出微服务概念以来,风靡一时,随着近些年的发展,已经逐步被千万企业所采用,多数为互联网企业.我于工作半年之后有幸参与到

手把手spring cloud整合zookeeper搭建微服务

环境配置:JDK8 +IDEA 开发工具 **说明:下面搭建过程基于你本地已经配置好zookeeper 一.先搭建父工程(PS:是可以不搭建父工程的,即每个服务和client都是单独的spring boot项目,也是OK的,搭建父工程纯粹为了将项目放在一起,且pom文件可以少一点而已!) 1.先搭建父工程:spring initial -- 第二步,Type改成Maven Pom,Artifact改成demo-parent,便于理解 -- 引入两个依赖,web和zookeeper-discove

SpringBoot+idea搭建微服务简化流程

作者:个人微信公众号:程序猿的月光宝盒 1.新建普通maven工程 2.在父级pom中按需修改 3.删除父级src目录 4.创建公共模块common,里面只有service接口和实体类 5.构建微服务模块,provider 6.引用Zookeeper和Dubbo的依赖 在这个provider中修改pom文件坐标 <dependencies> <!--引入公共模块项目--> <dependency> <groupId>cn.kgc</groupId>