当前位置:首页 > 服务端 > Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块

2022年09月17日 14:08:01服务端27

一、Dubbo框架

1、Dubbo介绍

Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2、Dubbo特点

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3、Dubbo框架入门案例

3.1、定义公共接口项目

说明:接口项目一般定义公共的部分,并且被第三方依赖.
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3.2、服务提供者介绍

3.2.1、提供者代码结构

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3.2.2、编辑实现类

package com.jt.dubbo.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.alibaba.dubbo.config.annotation.Service;
import com.jt.dubbo.mapper.UserMapper;
import com.jt.dubbo.pojo.User;
@Service(timeout=3000)	//3秒超时 内部实现了rpc
//@org.springframework.stereotype.Service//将对象交给spring容器管理
public class UserServiceImpl implements UserService {
     
	
	@Autowired
	private UserMapper userMapper;
	
	@Override
	public List<User> findAll() {
     
		System.out.println("我是第一个服务的提供者");
		return userMapper.selectList(null);
	}
	
	@Override
	public void saveUser(User user) {
     
		userMapper.insert(user);
	}
}

3.2.3、编辑提供者配置文件

server:
  port: 9000   #定义端口

spring:
  datasource:
    #引入druid数据源
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: root

#关于Dubbo配置   
dubbo:
  scan:
    basePackages: com.jt    #指定dubbo的包路径 扫描dubbo注解
  application:              #应用名称
    name: provider-user     #一个接口对应一个服务名称   一个接口可以有多个实现
  registry:  #注册中心 用户获取数据从机中获取 主机只负责监控整个集群 实现数据同步
    address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183
  protocol:  #指定协议
    name: dubbo  #使用dubbo协议(tcp-ip)  web-controller直接调用sso-Service
    port: 20880  #每一个服务都有自己特定的端口 不能重复.
     
mybatis-plus:
  type-aliases-package: com.jt.dubbo.pojo       #配置别名包路径
  mapper-locations: classpath:/mybatis/mappers/*.xml  #添加mapper映射文件
  configuration:
    map-underscore-to-camel-case: true                #开启驼峰映射规则

3.3、服务消费者介绍

3.3.1、编辑Controller

package com.jt.dubbo.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.dubbo.pojo.User;
import com.jt.dubbo.service.UserService;

@RestController
public class UserController {
     
	
	//利用dubbo的方式为接口创建代理对象 利用rpc调用
	@Reference
	private UserService userService; 
	
	/**
	 * Dubbo框架调用特点:远程RPC调用就像调用自己本地服务一样简单
	 * @return
	 */
	@RequestMapping("/findAll")
	public List<User> findAll(){
     	
		//远程调用时传递的对象数据必须序列化.
		return userService.findAll();
	}
	
	@RequestMapping("/saveUser/{name}/{age}/{sex}")
	public String saveUser(User user) {
     		
		userService.saveUser(user);
		return "用户入库成功!!!";
	}
}

3.3.2、编辑YML配置文件

server:
  port: 9001
dubbo:
  scan:
    basePackages: com.jt
  application:
    name: consumer-user   #定义消费者名称
  registry:               #注册中心地址
    address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183

3.3.3、Dubbo入门案例测试

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

4、关于Dubbo框架知识点

4.1、问题1:如果其中一个服务器宕机 用户访问是否受限?

答:由于zk的帮助,使得程序永远可以访问正确的服务器.并且当服务重启时,duboo有服务的自动发现功能,消费者不需要重启即可以访问新的服务.

4.2、问题2:如果ZK集群短时间宕机,用户访问是否受限?

答: 用户的访问不受影响,由于消费者在本地存储服务列表信息,当访问故障机时,自动的将标识信息改为down属性.

5、Dubbo负载均衡策略

5.1、负载均衡种类

1、客户端负载均衡
Dubbo/SpringCloud等微服务框架
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记
2.服务端负载均衡
说明:客户端发起请求之后,必须由统一的服务器进行负载均衡,所有的压力都在服务器中.
NGINX
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

5.2、Dubbo负载均衡方式

@RestController
public class UserController {
     
	
	//利用dubbo的方式为接口创建代理对象 利用rpc调用
	//@Reference(loadbalance = "random")			//默认策略  负载均衡随机策略
	//@Reference(loadbalance = "roundrobin")		//轮询方式
	//@Reference(loadbalance = "consistenthash")	//一致性hash  消费者绑定服务器提供者
	@Reference(loadbalance = "leastactive")			//挑选当前负载小的服务器进行访问
	private UserService userService; 
}

二、京淘项目Dubbo改造

1、改造JT-SSO

1.1、添加jar包文件

<!--引入dubbo配置 -->
<dependency>
     <groupId>com.alibaba.boot</groupId>
     <artifactId>dubbo-spring-boot-starter</artifactId>
      <version>0.2.0</version>
</dependency>

1.2、创建DubboUserService接口

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

1.3、创建提供者实现类

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

1.4、编辑提供者YML配置文件

server:
  port: 8093
  servlet:
    context-path: /
spring:
  datasource:
    #引入druid数据源
    #type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: root

  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp
#mybatis-plush配置
mybatis-plus:
  type-aliases-package: com.jt.pojo
  mapper-locations: classpath:/mybatis/mappers/*.xml
  configuration:
    map-underscore-to-camel-case: true

logging:
  level: 
    com.jt.mapper: debug

#关于Dubbo配置
dubbo:
  scan:
    basePackages: com.jt    #指定dubbo的包路径 扫描dubbo注解
  application:              #应用名称
    name: provider-user     #一个接口对应一个服务名称   一个接口可以有多个实现
  registry:  #注册中心 用户获取数据从机中获取 主机只负责监控整个集群 实现数据同步
    address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183
  protocol:  #指定协议
    name: dubbo  #使用dubbo协议(tcp-ip)  web-controller直接调用sso-Service
    port: 20880  #每一个服务都有自己特定的端口 不能重复.

1.5、启动服务提供者

测试Dubbo服务器启动是否正常.
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2、改造服务消费者JT-WEB

2.1、注入Service接口

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2.2、编辑消费者配置文件

server:
  port: 8092    
spring:     #定义springmvc视图解析器
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp

dubbo:
  scan:
    basePackages: com.jt
  application:
    name: consumer-web   #定义消费者名称
  registry:               #注册中心地址
    address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183

2.3、启动效果测试

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

三、用户模块实现

1、用戶注册

1.1、URL分析

根据url地址说明请求为同域请求.
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记
参数信息:
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

1.2、页面JS分析

说明:根据分析获取返回值数据信息应该为SysResult对象
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

1.3、编辑UserController

 /**
     * 需求: 实现用户信息注册
     * 1.url请求地址:  http://www.jt.com/user/doRegister
     * 2.请求参数:     {password:_password,username:_username,phone:_phone},
     * 3.返回值结果:   SysResult对象
     */
    @RequestMapping("/doRegister")
    @ResponseBody   //将数据转化为JSON
    public SysResult saveUser(User user){
     
        //消费者给予dubbo协议将user对象进行远程网络数据传输.
        userService.saveUser(user);
        return SysResult.success();
    }

1.4、编辑UserService

/**
     * 注意事项:
     *  1.暂时使用电话号码代替邮箱
     *  2.密码进行md5加密.
     *  3.入库操作注意事务控制
     * @param user
     */
    @Override
    public void saveUser(User user) {
     
        String md5Pass =
                DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
        user.setEmail(user.getPhone())
            .setPassword(md5Pass);
        userMapper.insert(user);
    }

1.5、页面效果展现

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2、关于ZK数据存储结构

说明:在zk中数据的存储采用树形结构的方式保存
命令: [root@localhost bin]# sh zkCli.sh
查询命令: ls /…
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3、用户单点登录原理介绍

3.1、传统方式登录存在的问题

说明: 如果采用SESSION的方式实现用户的登录操作,由于nginx负载均衡的策略,用户可以访问不同的服务器.但是Session不能共享,所以导致用户频繁的登录. 用户的体验不好.
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3.2、SSO

单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,**用户只需一次登录就可以访问所有相互信任的应用系统。**这种方式减少了由登录产生的时间消耗,辅助了用户管理,是目前比较流行的。

3.3、京淘项目单点登录设计

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记
实现步骤:
1.当用户输入用户名和密码点击登录时,将请求发送给JT-WEB消费者服务器.
2.JT-WEB服务器将用户信息传递给JT-SSO单点登录系统完成数据校验.
3.如果登录成功,则动态生成密钥信息,将user数据转化为json.保存到redis中. 注意超时时间的设定.
4.JT-SSO将登录的凭证 传给JT-WEB服务器.
5.JT-WEB服务器将用户密钥TICKET信息保存到用户的cookie中 注意超时时间设定.
6.如果登录不成功,则直接返回错误信息即可.

4、用户单点登录实现

4.1、页面url分析

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

4.2、页面参数分析

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

4.3、页面JS分析

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

4.4、编辑UserController

 /**
     * 完成用户登录操作
     * 1.url地址: http://www.jt.com/user/doLogin?r=0.9309436837648131
     * 2.参数:    {username:_username,password:_password},
     * 3.返回值结果:  SysResult对象
     *
     * 4.Cookie:
     *   4.1 setPath("/")  path表示如果需要获取cookie中的数据,则url地址所在路径设定.
     *       url:http://www.jt.com/person/findAll
     *       cookie.setPath("/");   一般都是/
     *       cookie.setPath("/person");
     *   4.2 setDomain("xxxxx")  设定cookie共享的域名地址.
     */
    @RequestMapping("/doLogin")
    @ResponseBody
    public SysResult doLogin(User user, HttpServletResponse response){
     
        String ticket = userService.doLogin(user);
        if(StringUtils.isEmpty(ticket)){
     
            //说明用户名或者密码错误
            return SysResult.fail();
        }else{
     
            //1.创建Cookie
            Cookie cookie = new Cookie("JT_TICKET",ticket);
            cookie.setMaxAge(7*24*60*60);   //设定cookie存活有效期
            cookie.setPath("/");            //设定cookie有效范围
            cookie.setDomain("jt.com");     //设定cookie共享的域名 是实现单点登录必备要素
            response.addCookie(cookie);
            return SysResult.success();     //表示用户登录成功!!
        }
    }

4.4、编辑UserService

/**
     * 1.获取用户信息校验数据库中是否有记录
     * 2.有  开始执行单点登录流程
     * 3.没有 直接返回null即可
     * @param user
     * @return
     */
    @Override
    public String doLogin(User user) {
       //username/password
        //1.将明文加密
        String md5Pass =
                DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
        user.setPassword(md5Pass);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
        //根据对象中不为null的属性当做where条件.
        User userDB = userMapper.selectOne(queryWrapper);
        if(userDB == null){
     
            //用户名或密码错误
            return null;
        }else{
      //用户名和密码正确  实现单点登录操作
            String ticket = UUID.randomUUID().toString();
            //如果将数据保存到第三方 一般需要脱敏处理
            userDB.setPassword("123456你信不??");
            String userJSON = ObjectMapperUtil.toJSON(userDB);
            jedisCluster.setex(ticket, 7*24*60*60, userJSON);
            return ticket;
        }
    }

4.5、页面效果展现

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

四、用户模块实现

1、用户信息回显

1.1、页面URL分析

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

1.2、检查页面JS

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

1.3、编辑JT-SSO的Controller

/**
     * 业务实现:
     *  1.用户通过cookie信息查询用户数据.    通过ticket获取redis中的业务数据.
     *  2.url请求: http://sso.jt.com/user/query/+ _ticket
     *  3.参数:    参数在url中. 利用restFul获取
     *  4.返回值要求: SysResult对象(userJSON)
     */
    @RequestMapping("/query/{ticket}")
    public JSONPObject findUserByTicket(@PathVariable String ticket,
                                        HttpServletResponse response,
                                        String callback){
     
        String userJSON = jedisCluster.get(ticket);
        //1.lru算法清空数据   2.有可能cookie信息有误
        if(StringUtils.isEmpty(userJSON)){
     
            //2.应该删除cookie信息.
            Cookie cookie = new Cookie("JT_TICKET", "");
            cookie.setMaxAge(0);
            cookie.setDomain("jt.com");
            cookie.setPath("/");
            response.addCookie(cookie);
            return new JSONPObject(callback,SysResult.fail());
        }
        return new JSONPObject(callback,SysResult.success(userJSON));
    }

2、编辑Cookie工具API

package com.jt.util;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieUtil {
     
    //1.新增cookie
    public static void addCookie(HttpServletResponse response,String cookieName, String cookieValue, int seconds, String domain){
     
        Cookie cookie = new Cookie(cookieName,cookieValue);
        cookie.setMaxAge(seconds);
        cookie.setDomain(domain);
        cookie.setPath("/");
        response.addCookie(cookie);
    }
    //2.根据name查询value的值
    public static String getCookieValue(HttpServletRequest request,String cookieName){
     

        Cookie[] cookies = request.getCookies();
        if(cookies !=null && cookies.length >0){
     
            for (Cookie cookie : cookies){
     
                if(cookieName.equals(cookie.getName())){
     
                    return cookie.getValue();
                }
            }
        }
        return null;
    }
    //3.删除cookie
    public static void deleteCookie(HttpServletResponse response,String cookieName,String domain){
     
        addCookie(response,cookieName,"",0, domain);
    }
}


3、用户退出操作

3.1、业务说明

如果用户点击退出操作, 首先应该删除Redis中的数据 其次删除Cookie中的数据 之后重定向到系统首页.

3.2、URL分析

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3.3、编辑UserController

	/**
     * 实现用户的退出操作.重定向到系统首页
     * url: http://www.jt.com/user/logout.html
     * 业务:
     *      1.删除Redis中的数据  key
     *      2.删除Cookie记录
     */
    @RequestMapping("logout")
    public String logout(HttpServletRequest request,HttpServletResponse response){
     
        //1.根据JT_TICKET获取指定的ticket
        String ticket = CookieUtil.getCookieValue(request,"JT_TICKET");

        //2.判断ticket是否为null
        if(!StringUtils.isEmpty(ticket)){
     
            jedisCluster.del(ticket);
            CookieUtil.deleteCookie(response,"JT_TICKET","jt.com");
        }
        return "redirect:/";
    }

五、实现商品详情展现

1、业务说明

说明: 当用户点击商品时,需要跳转到商品的展现页面中 页面名称item.jsp
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2、重构JT-MANAGE

2.1、创建接口

说明:在jt-common中创建接口
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2.2、编辑Dubbo实现类

package com.jt.service;


import com.alibaba.dubbo.config.annotation.Service;
import com.jt.mapper.ItemDescMapper;
import com.jt.mapper.ItemMapper;
import com.jt.pojo.Item;
import com.jt.pojo.ItemDesc;
import org.springframework.beans.factory.annotation.Autowired;

@Service(timeout = 3000)
public class DubboItemServiceImpl implements DubboItemService{
     

    @Autowired
    private ItemMapper itemMapper;
    @Autowired
    private ItemDescMapper itemDescMapper;
    
    @Override
    public Item findItemById(Long itemId) {
     
        return itemMapper.selectById(itemId);
    }

    @Override
    public ItemDesc findItemDescById(Long itemId) {
     
        return itemDescMapper.selectById(itemId);
    }
}

2.3、编辑YML配置文件

server:
  port: 8091
  servlet:
    context-path: /
spring:
  datasource:
    #引入druid数据源
    #type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: root

  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp
#mybatis-plush配置
mybatis-plus:
  type-aliases-package: com.jt.pojo
  mapper-locations: classpath:/mybatis/mappers/*.xml
  configuration:
    map-underscore-to-camel-case: true

logging:
  level: 
    com.jt.mapper: debug

#关于Dubbo配置
dubbo:
  scan:
    basePackages: com.jt    #指定dubbo的包路径 扫描dubbo注解
  application:              #应用名称
    name: provider-manage     #一个接口对应一个服务名称   一个接口可以有多个实现
  registry:  #注册中心 用户获取数据从机中获取 主机只负责监控整个集群 实现数据同步
    address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183
  protocol:  #指定协议
    name: dubbo  #使用dubbo协议(tcp-ip)  web-controller直接调用sso-Service
    port: 20881  #每一个服务都有自己特定的端口 不能重复.

2.4、编辑ItemController

package com.jt.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.pojo.Item;
import com.jt.pojo.ItemDesc;
import com.jt.service.DubboItemService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/items")
public class ItemController {
     

    @Reference(timeout = 3000)
    private DubboItemService itemService;

    /**
     * 实现商品详情页面跳转
     * url: http://www.jt.com/items/562379.html
     * 参数: 562379 itemId
     * 返回值:  item.jsp页面
     * 页面取值说明:
     *      ${item.title }   item对象
     *      ${itemDesc.itemDesc }  itemDesc对象
     *
     * 思路:
     *      1.重构jt-manage项目
     *      2.创建中立接口DubboItemService
     *      3.实现业务调用获取item/itemDesc对象
     */
    @RequestMapping("/{itemId}")
    public String findItemById(@PathVariable Long itemId, Model model){
     

        Item item = itemService.findItemById(itemId);
        ItemDesc itemDesc = itemService.findItemDescById(itemId);
        //将数据保存到request域中
        model.addAttribute("item",item);
        model.addAttribute("itemDesc",itemDesc);
        return "item";
    }
}

2.5、页面效果展现

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

六、购物车模块实现

1、创建服务提供者

1.1、创建项目JT-CART

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

1.2、添加继承/依赖/插件

 <!--2.添加依赖信息-->
    <dependencies>
        <!--依赖实质依赖的是jar包文件-->
        <dependency>
            <groupId>com.jt</groupId>
            <artifactId>jt-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <!--3.添加插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

1.3、编辑POJO对象

@TableName("tb_cart")
@Data
@Accessors(chain = true)
public class Cart extends BasePojo{
       //使用包装类型

    @TableId(type = IdType.AUTO)
    private Long id;
    private Long uesrId;        //用户ID号
    private Long itemId;        //商品ID号
    private String itemTitle;   //商品标题
    private String itemImage;   //图片
    private Long itemPrice;     //商品价格
    private Integer num;        //商品数量
}

1.4、编辑CartService接口

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

1.5、jt-cart代码结构

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2、购物车列表页面展现

2.1、页面url分析

说明:当用户点击购物车按钮时,需要跳转到购物车展现页面**. cart.jsp**
页面取值: ${cartList}
要求: 只查询userId=7的购物车列表信息.之后进行页面展现
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2.2、编辑CartController

package com.jt.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.pojo.Cart;
import com.jt.service.DubboCartService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
@RequestMapping("/cart")
public class CartController {
     

    @Reference(timeout = 3000,check = false)
    private DubboCartService cartService;

    /**
     * 业务需求: 根据userId查询购物车数据
     * url地址: http://www.jt.com/cart/show.html
     * 请求参数: 动态获取userId
     * 返回值结果:  cart.jsp页面
     * 页面取值方式: ${cartList}
     */
    @RequestMapping("/show")
    public String findCartListByUserId(Model model){
     
        Long userId = 7L;
        List<Cart> cartList = cartService.findCartListByUserId(userId);
        model.addAttribute("cartList",cartList);
        return "cart";
    }
}

2.3、编辑CartService

package com.jt.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.CartMapper;
import com.jt.pojo.Cart;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@Service
public class DubboCartServiceImpl implements DubboCartService{
     

    @Autowired
    private CartMapper cartMapper;

    @Override
    public List<Cart> findCartListByUserId(Long userId) {
     
        QueryWrapper<Cart> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", userId);
        return cartMapper.selectList(queryWrapper);
    }
}

2.4、页面效果展现

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3、购物车数量的修改

3.1、业务说明

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3.2、页面JS分析

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3.3、编辑CartController

  /**
     * 业务: 实现购物车数量的更新
     * url: http://www.jt.com/cart/update/num/562379/12
     * 参数: itemId/num
     * 返回值: void
     */
    @RequestMapping("/update/num/{itemId}/{num}")
    @ResponseBody  //1.返回值转化为json 2.ajax结束标识
    public void updateCartNum(Cart cart){
      //key名称必须与属性的名称一致.
        Long userId = 7L;
        cart.setUserId(userId);
        cartService.updateCartNum(cart);
    }

3.4、编辑CartService

 @Override
    public void updateCartNum(Cart cart) {
     

        //cartMapper.updateCartNum(cart);
        //1.准备修改的数据  根据对象中不为null的元素当做set条件
        Cart cartTemp = new Cart();
        cartTemp.setNum(cart.getNum());

        //2.根据对象中不为null的元素当做where条件
        UpdateWrapper<Cart> updateWrapper =
                        new UpdateWrapper<>(cart.setNum(null));
        /*updateWrapper.eq("user_id", cart.getUserId())
                     .eq("item_id", cart.getItemId());*/
        cartMapper.update(cartTemp,updateWrapper);
    }

3.5、编辑CartMapper

public interface CartMapper extends BaseMapper<Cart> {
     
    @Update("update tb_cart set num = #{num},updated=now() where user_id=#{userId} and item_id=#{itemId}")
    void updateCartNum(Cart cart);
}

4、购物车新增

4.1、购物车新增业务

当用户点击购物车按钮时实现购物车入库操作. 如果用户重复加购则应该修改购物车商品的数量.
加购成功之后,应该重定向到购物车列表页面.

4.2、页面分析

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

4.3、页面表单提交

<form id="cartForm" method="post">
									<input class="text" id="buy-num" name="num" value="1" onkeyup="setAmount.modify('#buy-num');"/>
									<input type="hidden" class="text"  name="itemTitle" value="${item.title }"/>
									<input type="hidden" class="text" name="itemImage" value="${item.images[0]}"/>
									<input type="hidden" class="text" name="itemPrice" value="${item.price}"/>
								</form>

4.4、页面JS解析

<a class="btn-append " id="InitCartUrl" onclick="addCart();" clstag="shangpin|keycount|product|initcarturl">加入购物车<b></b></a>
//利用post传值
		function addCart(){
     
			var url = "http://www.jt.com/cart/add/${item.id}.html";
			document.forms[0].action = url;		//js设置提交链接
			document.forms[0].submit();			//js表单提交
		}

4.5、编辑CartController

    /**
     * 完成购物车新增
     * url: http://www.jt.com/cart/add/562379.html
     * 参数: form表单提交  对象接收
     * 返回值: 重定向到购物车列表页面中
     */
    @RequestMapping("/add/{itemId}")
    public String saveCart(Cart cart){
     
        Long userId = 7L;
        cart.setUserId(userId);
        cartService.saveCart(cart);
        return "redirect:/cart/show.html";
    }

4.6、编辑CartService

    /**
     *  如果重复加购则更新数量
     * 1.查询是否已经有改数据 user_id/item_id
     */
    @Override
    public void saveCart(Cart cart) {
     
        QueryWrapper<Cart> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", cart.getUserId())
                    .eq("item_id", cart.getItemId());
        Cart cartDB = cartMapper.selectOne(queryWrapper);
        if(cartDB == null){
     
            //用户第一次加购
            cartMapper.insert(cart);
        }else {
     
            //用户需要修改数量
            int num = cart.getNum() + cartDB.getNum();
            cart.setNum(num);
            cartMapper.updateCartNum(cart);
        }
    }

4.7、页面效果

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

5、购物车删除操作

5.1、页面分析

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

5.2、编辑CartController

    /**
     * 购物车删除操作
     * url地址: http://www.jt.com/cart/delete/562379.html
     * 参数:    获取itemId
     * 返回值:  重定向到购物车的展现页面
     */
    @RequestMapping("/delete/{itemId}")
    public String deleteCarts(@PathVariable Long itemId){
     
        Long userId = 7L;
        cartService.deleteCarts(userId,itemId);
        return "redirect:/cart/show.html";
    }

5.3、编辑CartService

 @Override
    public void deleteCarts(Long userId, Long itemId) {
     
        QueryWrapper<Cart> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", userId);
        queryWrapper.eq("item_id", itemId);
        cartMapper.delete(queryWrapper);
    }

七、京淘权限实现

1、业务需求

当用户进行敏感操作时,必须要求用户先登录之后才可以访问后端服务器. 例如京东商城…
使用技术:
1.AOP
2.拦截器 :拦截用户的请求
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2、定义京淘拦截器

2.1、SpringMVC调用原理图

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2.2、SpringMVC拦截器工作原理

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2.3、配置拦截器

@Component  //spring容器管理对象
public class UserInterceptor implements HandlerInterceptor {
     

    @Autowired
    private JedisCluster jedisCluster;

    //Spring版本升级 4 必须实现所有的方法  spring 5 只需要重写指定的方法即可.
    /**
     * 需求:   拦截/cart开头的所有的请求进行拦截.,并且校验用户是否登录.....
     * 拦截器选择: preHandler
     * 如何判断用户是否登录:  1.检查cookie信息   2.检查Redis中是否有记录.
     *          true : 请求应该放行
     *          false: 请求应该拦截 则配合重定向的语法实现页面跳转到登录页面 使得程序流转起来

     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
     
        //1.判断用户是否登录  检查cookie是否有值
        String ticket = CookieUtil.getCookieValue(request,"JT_TICKET");
        //2.校验ticket
        if(!StringUtils.isEmpty(ticket)){
     
            //3.判断redis中是否有值.
            if(jedisCluster.exists(ticket)){
     
                //4.动态获取json信息
                String userJSON = jedisCluster.get(ticket);
                User user = ObjectMapperUtil.toObj(userJSON,User.class);
                request.setAttribute("JT_USER",user);
                return true;
            }
        }
        response.sendRedirect("/user/login.html");
        return false;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
     
        //销毁数据
        request.removeAttribute("JT_USER");
    }
}

2.4、动态获取UserId

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3、ThreadLocal介绍

3.1、ThreadLocal作用

名称: 本地线程变量
作用: 可以在同一个线程内,实现数据的共享.
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3.2、ThreadLocal入门案例

 	private ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
    public void a(){
     
        int a = 100;
        threadLocal.set(a);
        b();
    }

    public void b(){
     
        int a = threadLocal.get();
        int b  = 100*a;
    }

3.3、编辑ThreadLocal工具API

public class UserThreadLocal {
     

    //static不会影响影响线程  threadLocal创建时跟随线程.
    //private static ThreadLocal<Map<k,v>> threadLocal = new ThreadLocal<>();
    private static ThreadLocal<User> threadLocal = new ThreadLocal<>();

    public static void set(User user){
     
        threadLocal.set(user);
    }

    public static User get(){
     
        return threadLocal.get();
    }

    public static void remove(){
     
        threadLocal.remove();
    }
}

3.4、重构User拦截器

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3.5、动态获取UserId

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

八、京淘订单模块

1、订单表设计

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2、创建订单项目

2.1、创建项目

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2.2、添加继承依赖

  <!--2.添加依赖信息-->
    <dependencies>
        <!--依赖实质依赖的是jar包文件-->
        <dependency>
            <groupId>com.jt</groupId>
            <artifactId>jt-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <!--3.添加插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

2.3、添加POJO

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记
删除orderItem的主键标识
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

2.4、构建jt-order项目

订单项目代码结构如下
Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3、订单确认页面跳转

3.1、url分析

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

3.2、编辑OrderController

package com.jt.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.pojo.Cart;
import com.jt.service.DubboCartService;
import com.jt.service.DubboOrderService;
import com.jt.thread.UserThreadLocal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
@RequestMapping("/order")
public class OrderController {
     

    @Reference(timeout = 3000,check = false)
    private DubboOrderService orderService;
    @Reference(timeout = 3000,check = false)
    private DubboCartService cartService;

    /**
     * 订单页面跳转
     * url: http://www.jt.com/order/create.html
     * 页面取值: ${carts}
     */
    @RequestMapping("/create")
    public String create(Model model){
     
        //1.根据userId查询购物车信息
        Long userId = UserThreadLocal.get().getId();
        List<Cart> cartList = cartService.findCartListByUserId(userId);
        model.addAttribute("carts",cartList);
        return "order-cart";
    }
}

3.3、编辑OrderService

@Override
    public List<Cart> findCartListByUserId(Long userId) {
     
        QueryWrapper<Cart> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", userId);
        return cartMapper.selectList(queryWrapper);
    }

3.4、页面效果展现

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

4、关于SpringMVC参数提交问题说明

4.1、简单参数传参问题

1.页面url标识

2.Controller中的方法
public void xxx(String name,int age){
}

4.2、使用对象方法接收参数

1.页面url标识

2.Controller中的方法
public void xxx(User user){
}
public class User{
private Integer name;
private String age;
}

4.3、使用对象的引用为参数赋值

难点: 属性的重名提交问题…
1、解决思路: 可以采用对象引用的方式为属性赋值.

<input  name="name"   value="二郎神"	/>
<input  name="age"   value="3000"	/>
<input  name="dog.name"   value="哮天犬"	/>
<input  name="dog.age"   value="8000"	/>

2、Controller中的方法

    public void  xxx(User user){
     
	
	}
	public class Dog{
     
		private String name;
		private Integer age;	
	}
	public class User{
     
		private String name;
		private Integer age;	
		private Dog dog;
	}

5、关于订单提交

5.1、页面URL说明

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

5.2、请求参数

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

5.3、页面JS解析

jQuery.ajax( {
     
			type : "POST",
			dataType : "json",
			url : "/order/submit",
			data : $("#orderForm").serialize(),
			// data: {"key":"value","key2":"value2".....}
			// data:  id=1&name="xxx"&age=18......
			cache : false,
			success : function(result) {
     
				if(result.status == 200){
     
					location.href = "/order/success.html?id="+result.data;
				}else{
     
					$("#submit_message").html("订单提交失败,请稍后重试...").show();
				}
			},
			error : function(error) {
     
				$("#submit_message").html("亲爱的用户请不要频繁点击, 请稍后重试...").show();
			}
		})

5.4、编辑OrderController

 /**
     * 订单提交
     * url: http://www.jt.com/order/submit
     * 参数: 整个form表单
     * 返回值: SysResult对象   携带返回值orderId
     * 业务说明:
     *   当订单入库之后,需要返回orderId.让用户查询.
     */
    @RequestMapping("/submit")
    @ResponseBody
    public SysResult saveOrder(Order order){
     
        Long userId = UserThreadLocal.get().getId();
        order.setUserId(userId);
        String orderId = orderService.saveOrder(order);
        if(StringUtils.isEmpty(orderId))
            return SysResult.fail();
        else
            return SysResult.success(orderId);
    }

5.5、编辑OrderService

@Service(timeout = 3000)
public class DubboOrderServiceImpl implements DubboOrderService {
     

    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private OrderItemMapper orderItemMapper;
    @Autowired
    private OrderShippingMapper orderShippingMapper;

    /**
     * Order{order订单本身/order物流信息/order商品信息}
     * 难点:  操作3张表完成入库操作
     * 主键信息: orderId
     * @param order
     * @return
     */
    @Override
    public String saveOrder(Order order) {
     
        //1.拼接OrderId
        String orderId =
                "" + order.getUserId() + System.currentTimeMillis();
        //2.完成订单入库
        order.setOrderId(orderId).setStatus(1);
        orderMapper.insert(order);

        //3.完成订单物流入库
        OrderShipping orderShipping = order.getOrderShipping();
        orderShipping.setOrderId(orderId);
        orderShippingMapper.insert(orderShipping);

        //4.完成订单商品入库
        List<OrderItem> orderItems = order.getOrderItems();
        //批量入库  sql: insert into xxx(xxx,xx,xx)values (xx,xx,xx),(xx,xx,xx)....
        for (OrderItem orderItem : orderItems){
     
            orderItem.setOrderId(orderId);
            orderItemMapper.insert(orderItem);
        }
        System.out.println("订单入库成功!!!!");
        return orderId;
    }
}

6、订单成功跳转

6.1、页面url分析

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

6.2、编辑OrderController

 /**
     * 实现商品查询
     * 1.url地址: http://www.jt.com/order/success.html?id=71603356409924
     * 2.参数说明: id 订单编号
     * 3.返回值类型: success.html
     * 4.页面取值方式: ${order.orderId}
     */
    @RequestMapping("/success")
    public String findOrderById(String id,Model model){
     
        Order order = orderService.findOrderById(id);
        model.addAttribute("order",order);
        return "success";
    }

6.3、编辑OrderService

 @Override
    public Order findOrderById(String id) {
     
        //1.查询订单信息
        Order order  = orderMapper.selectById(id);
        //2.查询订单物流信息
        OrderShipping orderShipping = orderShippingMapper.selectById(id);
        //3.查询订单商品
        QueryWrapper<OrderItem> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("order_id",id);
        List<OrderItem> lists =orderItemMapper.selectList(queryWrapper);
        return order.setOrderItems(lists).setOrderShipping(orderShipping);
    }

6.4、页面效果展现

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

九、项目结构图

Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块 _ JavaClub全栈架构师技术笔记

作者:77xiaolu
来源链接:https://blog.csdn.net/xiaolu_0/article/details/109207616

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/42754.html

标签: Dubbo
分享给朋友:

“Dubbo框架、用户注册、单点登录系统、用户登出、购物车系统、设置拦截器,实现用户权限校验、ThreadLocal、订单系统模块” 的相关文章

springboot整合最新版dubbo以及dubbo-admin的安装

springboot整合最新版dubbo以及dubbo-admin的安装

一、安装前准备   由于dubbo被阿里捐献给了apache,这次安装admin时,参考网上的资料,地址还是停留在之前的链接,踩了不少坑,这里记录下。   dubbo-admin下载地址:   地址一:https://github.com/apache/incubat...

SpringCloud、dubbo 和 druid 问题总结

SpringCloud、dubbo 和 druid 问题总结

背景:   我们当前的微服务架构采用的是 SpringCloud 全家桶 + dubbo + druid + apllo 等技术集成的。 1、多服务实例相同端口冲突问题   目前线上服务器内容动辄 128 ~ 256GB,我们一个服务最大内存设置不超过 32GB,那么...

史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!

史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!

想往高处走,怎么能不懂 Dubbo? Dubbo是国内最出名的分布式服务框架,也是 Java 程序员必备的必会的框架之一。Dubbo 更是中高级面试过程中经常会问的技术,无论你是否用过,你都必须熟悉。 下面我为大家准备了一些 Dubbo 常见的的面...

搭建SpringBoot+dubbo+zookeeper+maven框架(一)

搭建SpringBoot+dubbo+zookeeper+maven框架(一)

这几天项目还没来,所以就自己试着参考网上的一些资料,搭建了一个SpringBoot+dubbo+zookeeper+maven框架,网上参考的很多资料照着他们一步一步搭建,最后很多都运行不通,很是郁闷,最后自己在总结了他们之后自己搭建了一个,项目的源码我会附在文章的最后,并且后期还会继...

SpringCloud与Dubbo区别

为什么放弃Dubbo 使用SpringCloud?   相同点:SpringCloud 和Dubbo可以实现RPC远程调用框架,可以实现服务治理。   不同点:  SpringCloud是一套目前比较网站微服务框架了,整合了分...

SpringCloud采用Dubbo远程调用(SpringCloud Alibaba)

SpringCloud采用Dubbo远程调用(SpringCloud Alibaba)

系统架构:      这里只演示以下组件,其他组件的使用和SpringCloud一样     application-1 :应用1,模拟应用,提供http接口服务。     service-1 :微服务1,模拟微服务,提供dubbo接口服务。     se...

dubbo + nacos

dubbo + nacos 文章目录 dubbo + nacos 一、下载nacos并启动 1.下载地址 2.启动 3.登录...

Dubbo常用标签

Dubbo中常用有7个标签。 分为三个类别:公用标签,服务提供者标签,服务消费者标签 公用标签 <dubbo:application/>和  <dubbo:registry/> A、配置应用信息 <du...

搞定 Dubbo 系列(五):Dubbo的序列化协议

搞定 Dubbo 系列(五):Dubbo的序列化协议

Dubbo是RPC服务端端框架的杰出代表,由于走TCP天生比HTTP快的原因,在springboot盛行的restful(http)情况下,dubbo依旧火热。今天来总结下dubbo常见的几种序列化协议。 一、dubbo协议(默认) dubbo协议是默认推荐的协议。使...

dubbo,zookeeper,eureka之间的关系与区别

CAP原则 先来解释下分布式系统中的CAP原则:指的是在一个分布式系统中,C - Consistency(一致性)、 A - Availability(可用性)、P - Partition tolerance(分区容错性),三者不可兼得。 其中,P - Partiti...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。