京东淘宝day17
1. Dubbo框架優勢
1.1 問題說明
問題1: 當服務生產者有一個宕機,問程序是否正常運行???
說明: 由于dubbo框架的機制,依然可以保證正常運行…
問題2: 如果整合zk集群宕機,問程序是否運行正常??
說明: 如果只是主機宕機,則zk有高可用的效果,程序不受影響.
說明2: 如果整合zk集群宕機,則用戶依然可以正常訪問,但是現在的程序處于危險狀態.
說明3: 如果在上述的情況下,再次宕機一臺生產者 程序依然可以正常運行. 因為維護了本地的服務列表信息.
2. Dubbo 負載均衡機制
2.1 負載均衡種類
說明: dubbo框架中負載均衡機制是客戶端負載均衡. 該配置需要在客戶端(消費者)中配置即可.
2.1.1 負載均衡-隨機策略
1).類名稱
2).配置負載均衡機制
2.1.2 負載均衡-輪詢機制
1).設置輪詢策略
1).輪詢類名
2.1.3 負載均衡-一致性hash
1).Controller配置
2).具體類名
2.1.3 負載均衡-“最少訪問”
1).編輯Controller
2).具體類名
2.2 數據在zk中存儲結構說明
3.重構京淘項目
3.1 改造京淘項目
3.1.1 導入jar包
<!--引入dubbo配置 如果下載失敗 則去本地倉庫中刪除重新下載--><dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>0.2.0</version></dependency>3.1.2 定義Dubbo接口
3.2 定義服務生產者
3.2.1 編輯UserController
3.2.2 編輯YML配置文件
server:port: 8093servlet:context-path: / spring:datasource:#引入druid數據源#type: com.alibaba.druid.pool.DruidDataSource#driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true#鏈接的是數據庫代理#url: jdbc:mysql://192.168.126.129:8066/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=trueusername: rootpassword: rootmvc:view:prefix: /WEB-INF/views/suffix: .jsp #mybatis-plush配置 mybatis-plus:type-aliases-package: com.jt.pojomapper-locations: classpath:/mybatis/mappers/*.xmlconfiguration:map-underscore-to-camel-case: truelogging: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:2183protocol: #指定協議name: dubbo #使用dubbo協議(tcp-ip) web-controller直接調用sso-Serviceport: 20880 #每一個服務都有自己特定的端口 不能重復.3.3 定義服務消費者
3.3.1 編輯UserController
3.3.2 編輯YML配置文件
server:port: 8092 spring: #定義springmvc視圖解析器mvc:view:prefix: /WEB-INF/views/suffix: .jspdubbo:scan:basePackages: com.jtapplication:name: consumer-user #定義消費者名稱registry: #注冊中心地址address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:21834 完成京淘單點登錄業務實現
4.1 用戶注冊實現
4.1.1 業務需求說明
說明: 當用戶點擊新增按鈕時,應該將數據由jt-web服務器,傳遞給jt-sso項目完成入庫操作.同時返回有效信息進行校驗.
4.1.2 頁面分析
1).url分析
2).參數說明
3). 檢查頁面JS
4.1.3 編輯JT-WEB UserController
/*** 完成用戶注冊操作* 1.url地址:http://www.jt.com/user/doRegister* 2.參數: password: admin123* username: admin12332412341234* phone: 13111112227* 3.返回值: SysResult對象*/@RequestMapping("/doRegister")@ResponseBody //將返回值結果轉化為JSONpublic SysResult saveUser(User user){userService.saveUser(user);return SysResult.success();}4.1.4 編輯JT-SSO UserService
package com.jt.service;import com.alibaba.dubbo.config.annotation.Service; import com.jt.mapper.UserMapper; import com.jt.pojo.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.DigestUtils; import sun.security.provider.MD5;@Service public class DubboUserServiceImpl implements DubboUserService{@Autowiredprivate UserMapper userMapper;/*** 業務:* 1.將密碼進行加密處理* 2. 郵箱暫時用電話代替* @param user*/@Overridepublic void saveUser(User user) {byte[] bytes = user.getPassword().getBytes();//利用Spring工具API進行加密操作String md5Pass = DigestUtils.md5DigestAsHex(bytes);user.setPassword(md5Pass).setEmail(user.getPhone());userMapper.insert(user);} }4.2 用戶實現單點登錄
4.2.1 業務需求
要求: 用戶只需要登錄一次,則可以在任意的服務器享受免密登錄.有效期為30天.
sso介紹:
單點登錄(SingleSignOn,SSO),就是通過用戶的一次性鑒別登錄。當用戶在身份認證服務器上登錄一次以后,即可獲得訪問單點登錄系統中其他關聯系統和應用軟件的權限,同時這種實現是不需要管理員對用戶的登錄狀態或其他信息進行修改的,這意味著在多個應用系統中,用戶只需一次登錄就可以訪問所有相互信任的應用系統。這種方式減少了由登錄產生的時間消耗,輔助了用戶管理,是目前比較流行的 [1]
4.2.2 單點登錄實現原理
單點登錄實現步驟:
1.用戶通過用戶名和密碼訪問jt-web服務器.
2.JT-WEB服務器通過JT-SSO校驗用戶名和密碼是否正確.
3.如果用戶名和密碼正確,則將數據保存到redis中. TICKET密鑰:USERJSON,之后將密鑰返回給用戶即可.
4.JT-WEB服務器將密鑰信息保存到用戶的Cookie中 并且設定Cookie的共享/有效時間.
4.2.3 登錄頁面分析
1).url分析
2).參數分析
3).頁面JS
4.2.4 編輯UserController
/*** 業務需求:* 實現用戶單點登錄操作* 1.url地址:http://www.jt.com/user/doLogin?r=0.43530970885614617* 2.請求參數: username: asdasdfas* password: asdfasdfa* 3.返回值結果: SysResult對象** 實現Cookie數據存儲* 1.獲取用戶名和密碼進行數據校驗* 2.獲取后端的密鑰信息 非空????* 3.如果一切正常,則將數據存儲到Cookie中. 路徑/有效期/共享問題** 關于Cookie說明:* 1.cookie只能看到自己域名下的cookie 私有的.* 2.setPath說明* setPath("/") 一般都是/ 讀取cookie權限的設定,根目錄中的請求 讀取cookie* setPath("/user") url地址路徑/user下時才能獲取cookie信息.* url1: http://www.jt.com/findUser;* url2: http://www.jt.com/user/findUser;**/@RequestMapping("/doLogin")@ResponseBodypublic SysResult userLogin(User user, HttpServletResponse response){String ticket = userService.findUserByUP(user);if(!StringUtils.hasLength(ticket)){//如果數據為null則表示用戶名和密碼錯誤...return SysResult.fail();}//需要將數據保存到cookie中Cookie cookie = new Cookie("JT_TICKET", ticket);cookie.setPath("/");cookie.setMaxAge(7*24*60*60); //設定有效期 7天有效 單位秒cookie.setDomain("jt.com"); //主要域名中由jt.com則可以共享數據response.addCookie(cookie); //將數據寫入客戶端return SysResult.success();}4.2.5 編輯UserService
/*** 1.校驗用戶名和密碼是否正確 不存在直接返回null* 2.動態生成密鑰 將用戶信息轉化為JSON* 3.將數據保存到redis中 7天有效.* 4.返回密鑰ticket信息.* @param user* @return*/@Overridepublic String findUserByUP(User user) {String md5Pass =DigestUtils.md5DigestAsHex(user.getPassword().getBytes());user.setPassword(md5Pass);//1.根據對象中不為null的屬性當做where條件QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);User userDB = userMapper.selectOne(queryWrapper);//2.判斷對象是否有值if(userDB==null){return null;}//3.表示用戶名和密碼正確 開啟單點登錄操作String ticket = UUID.randomUUID().toString().replace("-", "");//轉化之前應該將數據進行脫敏處理userDB.setPassword("123456");String userJSON = ObjectMapperUtil.toJSON(userDB);//4.將數據保存到redis中jedisCluster.setex(ticket, 7*24*60*60, userJSON);return ticket;}4.2.6 效果測試
4.3 用戶數據回顯
4.3.1 業務分析
如果用戶登錄成功之后,則通過cookie數據利用JSONP跨域方式,實現數據的動態獲取.
4.3.2 頁面URL分析
1).頁面URL分析
2).檢查頁面JS
4.3.3 編輯JT_SSO UserController
/*** 跨域請求:完成用戶信息獲取* URL網址: http://sso.jt.com/user/query/dca70b16a1c54aea9ebb0b27621250de?callback=jsonp1608021961735&_=1608021961777* 參數: 參數1: ticket信息 參數2:callback* 返回值: SysResult對象(用戶數據......)*/@RequestMapping("/query/{ticket}")public JSONPObject findUserByTicket(@PathVariable String ticket,String callback){//如何獲取用戶信息? 從redis中獲取數據if(jedisCluster.exists(ticket)){String userJSON = jedisCluster.get(ticket);SysResult sysResult = SysResult.success(userJSON);return new JSONPObject(callback, sysResult);}else{return new JSONPObject(callback, SysResult.fail());}}5 作業
1.完成用戶退出操作 重定向到系統首頁刪除cookie記錄 有效期設置0 刪除redis 根據key來刪除 key從哪來??? 提示 request對象重定向和跨域有啥區別?????重定向:自己訪問自己的系統,出于業務的需要.跨域: 不同的系統之間的數據的交互. 為我自己的業務提供幫助.總結
- 上一篇: 计算机为什么检测不到u盘启动项,BIOS
- 下一篇: 2-2 用Plot函数绘图