欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

京淘实训Day17-dubbo框架实现业务操作

程序员文章站 2022-03-29 16:51:43
...

1.Dubbo框架说明

1.1客户端负载均衡

1.1.1 nginx集中式负载均衡说明

京淘实训Day17-dubbo框架实现业务操作
说明: nginx的负载均衡方式为集中式的负载均衡策略.用户的所有请求都会经过nginx之后,才能分发给不同的服务器.
如果nginx服务器宕机,则整个程序将会受到影响.

1.1.2客户端负载均衡策略

说明: 客户端负载均衡不需要专门的负载均衡服务器. 客户端负载均衡机制 在客户端访问服务器时,已经完成了负载均衡的配置.所有客户端负载均衡机制效率更高,并且耦合性低. 如果其中某台客户端发生了问题.不会影响其他的服务器.
京淘实训Day17-dubbo框架实现业务操作

1.2 负载均衡策略

1.2.1 负载均衡种类

京淘实训Day17-dubbo框架实现业务操作

1.2.2 一致性hash算法

说明:根据客户端IP地址绑定服务器. 以后该客户端访问的服务器是固定的.

////利用dubbo的方式为接口创建代理对象 利用rpc调用
	@Reference(loadbalance="consistenthash")	//一致性hash算法
	private UserService userService;  //代理对象

1.2.3 最小访问

挑选当前负载压力小的服务器进行访问.

	////利用dubbo的方式为接口创建代理对象 利用rpc调用
	@Reference(loadbalance="leastactive")	//一致性hash算法
	private UserService userService;  //代理对象

1.2.4 随机算法

////利用dubbo的方式为接口创建代理对象 利用rpc调用
	@Reference(loadbalance="random")	//一致性hash算法
	private UserService userService;  //代理对象

1.2.5 轮询算法

说明.在权重配置一样的条件下,采用轮询算法.

////利用dubbo的方式为接口创建代理对象 利用rpc调用
	@Reference(loadbalance="roundrobin")	//一致性hash算法
	private UserService userService;  //代理对象

2 京淘项目改造

2.1项目规划

1).jt-manage 提供者
2).jt-sso 提供者
3).jt-web 消费者
4).jt-common 中立方接口

导入jar包
说明:在jt 的pom.xml文件中添加jar包依赖信息

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

2.2定义中立接口

京淘实训Day17-dubbo框架实现业务操作

2.3 改造服务提供者

2.3.1编辑接口实现

	
@Service
public class DubboUserServiceImpl implements DubboUserService {
	
	@Autowired
	private UserMapper userMapper;
}

2.3.2编辑YML配置文件

	server:
  port: 8093
  servlet:
    context-path: /
spring:
  datasource:
    #引入druid数据源
    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

  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的包路径
  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  #每一个服务都有自己特定的端口 不能重复.    
   

2.4 改造服务消费者

2.4.1 编辑UserController

京淘实训Day17-dubbo框架实现业务操作

2.4.2 编辑消费者YML配置文件

	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
  

3.京淘项目业务实现

3.1 用户注册功能

3.1.1业务说明

当用户填写完成信息之后点击注册按钮时.发起请求,将用户信息实现数据入库操作.
京淘实训Day17-dubbo框架实现业务操作

3.1.2 页面分析

1).url地址信息
京淘实训Day17-dubbo框架实现业务操作
2).参数提交
京淘实训Day17-dubbo框架实现业务操作
3).检查页面JS

		$.ajax({
			type : "POST",
			url : "/user/doRegister",
			contentType : "application/x-www-form-urlencoded; charset=utf-8",
			data : {password:_password,username:_username,phone:_phone},
			dataType : 'json',
			success : function(result) {
				if(result.status == "200"){
					// 注册成功,去登录页
					showMessage('注册成功,请登录!');
					verc();
					$("#registsubmit").removeAttr("disabled").removeClass()
							.addClass("btn-img btn-regist");
					isSubmit = false;
					return;
				}else{
					showMessage('注册失败,请联系管理员!');
					//alert('注册失败,请重新注册!   ' + result.data );
				}
		}

3.1.3 业务接口说明

url地址: /user/doRegister
参数: {password:_password,username:_username,phone:_phone}
返回值: 系统VO对象 SysResult 对象
任务描述:
接收客户端提交的数据,之后完成用户信息的入库操作. 其中密码需要采用md5的方式进行加密操作.
由于暂时没有邮箱校验,所以用电话号码代替.

3.1.4 编辑 UserController

	/**
	 * 用户数据注册
	 * url:/user/doRegister
	 * 参数:{password:_password,username:_username,phone:_phone}
	 * 返回值:SysResult对象 的json数据
	 */
	@RequestMapping("/doRegister")
	@ResponseBody	//手动转化为json
	public SysResult saveUser(User user) {
		
		userService.saveUser(user);
		return SysResult.success();
	}

3.1.5 编辑 UserService

	
	package com.jt.service;

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;

import com.alibaba.dubbo.config.annotation.Service;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;

@Service
public class DubboUserServiceImpl implements DubboUserService {
	
	@Autowired
	private UserMapper userMapper;
	
	@Transactional	//事物控制
	@Override
	public void saveUser(User user) {
		
		//1.密码加密
		String md5Pass = 
				DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
		user.setPassword(md5Pass)
			.setEmail(user.getPhone())	//电话号码填充
			.setCreated(new Date())
			.setUpdated(user.getCreated()); //保证时间一致!!!
		userMapper.insert(user);
	}
	
	
}

3.1.6 页面效果展现

京淘实训Day17-dubbo框架实现业务操作

3.2 单点登陆业务实现

3.2.1 什么是单点登录

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

3.2.2 为什么使用单点登录

京淘实训Day17-dubbo框架实现业务操作
问题说明:
1).用户信息与服务器绑定带来诸多不便
2).用户信息保存时,最好设定有效期
3).用户信息最好进行加密的处理.只能通过**获取,保证用户信息的安全性.

3.2.3 京淘单点登陆系统设计

京淘实训Day17-dubbo框架实现业务操作
步骤:
1.用户输入用户名和密码之后,点击登陆按钮访问jt-web服务器
2.jt-web服务器接收username和password之后将数据发往jt-sso服务器校验信息
3.JT-SSO校验数据,如果成功则生成TICKET(UUID),和userJSON数据,保存到redis中(7天有效)
4.无论登陆成功还是失败,JT-SSO服务器必须返回给JT-WEB响应信息
5.如果用户登陆成功,则将TICKET信息保存到用户的Cookie中
6.如果用户登陆成功之后,下次再访问服务器时,通过cookie获取ticket信息校验用户是否登陆.

3.2.4页面分析

1).url分析
京淘实训Day17-dubbo框架实现业务操作
2).参数分析
京淘实训Day17-dubbo框架实现业务操作
3).页面JS分析
京淘实训Day17-dubbo框架实现业务操作

3.2.5 编辑UserController

	/**
	 * 业务要求:
	 * 1.http://www.jt.com/user/doLogin?r=0.9169833675441843 避免浏览器缓存
	 * 2.参数信息:{username:_username,password:_password},
	 * 3.返回值结果: SysResult对象的返回
	 */
	
	@RequestMapping("/doLogin")
	public SysResult doLogin(User user,HttpServletResponse response) {
		
		//1.进行用户登陆操作,获取返回值结果ticket
		String ticket = userService.doLogin(user);
		
		//2.判断业务数据是否有效
		if(StringUtils.isEmpty(ticket)) {
			//如果参数为null,则表示用户登陆失败.
			return SysResult.fail();
		}
		
		//3.将获取的ticket**信息保存到cookie中. 7天有效 可以实现数据共享.
		Cookie cookie = new Cookie(TICKET, ticket);
		cookie.setDomain("jt.com");
		cookie.setPath("/");
		cookie.setMaxAge(7*24*60*60);
		response.addCookie(cookie);
	}

3.2.6 编辑UserService

	/**
	 * 完成用户的登陆操作
	 * 1.查询用户数据,校验是否有效
	 * 2.将数据保存到redis中,之后返回ticket信息
	 */
	
	@Override
	public String doLogin(User user) {
		
		//1.根据user信息查询数据库记录.   根据其中不为null的属性充当where条件
		String md5Pass = 
				DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
		user.setPassword(md5Pass);
		QueryWrapper<User> queryWrapper = new QueryWrapper<User>(user);
		User userDB = userMapper.selectOne(queryWrapper);
		
		//2.判断数据是否有值
		if(userDB == null) { //用户名和密码错误.
			return null;
		}
		
		//3.开启单点登陆操作
		String ticket = UUID.randomUUID().toString();
		//将数据进行脱敏处理. 将一些重要的数据屏蔽.
		userDB.setPassword("你猜猜!!!");
		String userJSON = ObjectMapperUtil.toJSON(userDB);
		
		//4.将数据保存到redis中
		jedisCluster.setex(ticket, 7*24*60*60, userJSON);
		return ticket;
	}

3.2.7 页面效果

京淘实训Day17-dubbo框架实现业务操作

3.3 用户信息回显

3.3.1业务说明

说明:当用户登陆成功之后,发起ajax请求,目的获取用户信息,予以数据的回显.
京淘实训Day17-dubbo框架实现业务操作

3.3.2页面分析

1).url分析
京淘实训Day17-dubbo框架实现业务操作
2).页面JS分析
京淘实训Day17-dubbo框架实现业务操作

3.3.3编辑JT-SSO的 UserController

	/**
	 * 业务接口说明
	 * 1.url网址: http://sso.jt.com/user/query/{ticket}?callback=jsonp1593
	 * 2.参数: ticket信息
	 * 3.返回值结果: SysResult对象(userJSON)信息
	 * 
	 * 业务逻辑说明: 根据ticket信息,查询redis获取userJSON信息
	 */
	@RequestMapping("/user/query/{ticket}")
	public JSONPObject findUserByTicket(@PathVariable String ticket,
			String callback) {
		
		if(jedisCluster.exists(ticket)) {
			String userJSON = jedisCluster.get(ticket);
			//表示用户已经登陆
			return new JSONPObject(callback,SysResult.success(userJSON));
		}else {
			//根据ticket查询redis中并没有该记录.
			return new JSONPObject(callback,SysResult.fail());
		}
	}

3.3.4 页面成功标识

京淘实训Day17-dubbo框架实现业务操作

3.4 用户退出操作

3.4.1业务说明

说明:当用户点击退出按钮时,应该跳转到系统首页. 同时删除用户的登陆凭证 1.cookie信息 2.redis数据.

3.4.2 页面说明

1).url说明
http://www.jt.com/user/logout.html
京淘实训Day17-dubbo框架实现业务操作
2).返回值 重定向到系统首页

3.4.3 编辑UserController

	/**
	 * 实现用户的退出操作
	 * url地址:/user/logout.html
	 * 返回值结果:  重定向到系统首页
	 * 业务功能: 
	 * 	 1.删除cookie  设定最大的超时时间0
	 * 	 2.删除redis	      根据ticket信息删除redis
	 * 
	 * 知识补充: 通过request对象获取的cookie信息只有name/value 其他的信息
	 * request对象无权获取.
	 */
	@RequestMapping("/logout")
	public String logout(HttpServletRequest request,HttpServletResponse response) {
		//1.首先获取JT_TICKET的cookie信息
		Cookie[] cookies = request.getCookies();
		for (Cookie cookie : cookies) {
			if(TICKET.equals(cookie.getName())) {
				//删除redis
				String ticket = cookie.getValue();
				jedisCluster.del(ticket);
				
				//删除cookie
				cookie.setDomain("jt.com");
				cookie.setPath("/");
				cookie.setMaxAge(0);	//控制cookie有效期.
				response.addCookie(cookie);
				break;	//跳出循环
			}
		}
		
		
		return "redirect:/";  //重定向到系统的根目录
	}

3.5 商品信息展现

3.5.1业务说明

当用户点击某一个商品时,通过页面展现商品详情信息. 商品信息/商品详情信息
京淘实训Day17-dubbo框架实现业务操作

3.5.2将jt-manage改造为dubbo项目

3.5.2.1 编辑Service实现类

	//实现dubbo接口
@Service
public class DubboItemServiceImpl implements DubboItemService {
	
	@Autowired
	private ItemMapper itemMapper;
	@Autowired
	private ItemDescMapper itemDescMapper;
	
	
}

3.5.2.2 编辑YML配置文件

	server:
  port: 8091
  servlet:
    context-path: /
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

  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的包路径
  application:              #应用名称
    name: provider-item     #一个接口对应一个服务名称
  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  #每一个服务都有自己特定的端口 不能重复. 

3.5.3页面分析

url地址:http://www.jt.com/items/562379.html
跳转页面名称: item.jsp
页面取值方式:
京淘实训Day17-dubbo框架实现业务操作

3.5.4编辑ItemController实现商品展现

	package com.jt.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.pojo.Item;
import com.jt.pojo.ItemDesc;
import com.jt.service.DubboItemService;

@Controller
public class ItemController {
	
	@Reference(check=false)
	private DubboItemService itemService;
	
	/**
	 * url:http://www.jt.com/items/{itemId}.html
	 * 参数: itemId 商品编号
	 * 返回值: 
	 * 		1.页面返回值     item.jsp    
	 * 		2.数据返回值     item数据对象   
	 * 									${item.title }
	 * 									${itemDesc.itemDesc }
	 */
	@RequestMapping("/items/{itemId}")
	public String findItemById(@PathVariable Long itemId,Model model) {
		
		//1.根据itemId 查询item信息
		Item item = itemService.findItemById(itemId);
		model.addAttribute("item", item);
		
		//2.根据itemId 查询ItemDesc信息
		ItemDesc itemDesc = itemService.findItemDescById(itemId);
		model.addAttribute("itemDesc", itemDesc);
		return "item";
	}
	
}

3.5.5编辑ItemService

	package com.jt.service;

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

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;

//实现dubbo接口
@Service
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);
	}
	
	
}

3.5.6 页面效果展现

京淘实训Day17-dubbo框架实现业务操作

作业

1).完成用户登陆相关操作 视频记录
2).完成商品信息查询 视频记录.

相关标签: 实训