1.Dubbo
1.1 Dubbo介绍
Apache Dubbo |db| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大外围能力:面向接口的近程办法调用,智能容错和负载平衡,以及服务主动注册和发现。

1.2 Dubbo特点

2.Dubbo入门案例

2.1 编辑实现类
@Service(timeout=3000) //3秒超时 外部实现了rpc
//@org.springframework.stereotype.Service//将对象交给spring容器治理
public class UserServiceImpl implements UserService {

@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> findAll() {        System.out.println("我是第一个服务的提供者");    return userMapper.selectList(null);}@Overridepublic void saveUser(User user) {        userMapper.insert(user);}

}

2.2 编辑提供者的配置文件
server:
port: 9000 #定义端口

spring:
datasource:

#引入druid数据源type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=trueusername: rootpassword: 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-Serviceport: 20880  #每一个服务都有本人特定的端口 不能反复.  

mybatis-plus:
type-aliases-package: com.jt.dubbo.pojo #配置别名包门路
mapper-locations: classpath:/mybatis/mappers/*.xml #增加mapper映射文件
configuration:

map-underscore-to-camel-case: true                #开启驼峰映射规定

2.3服务消费者介绍
编辑controller

@RestController
public class UserController {

//利用dubbo的形式为接口创立代理对象 利用rpc调用@Referenceprivate 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 "用户入库胜利!!!";}

}
2.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

2.4对于Dubbo框架知识点

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

答:因为zk的帮忙,使得程序永远能够拜访正确的服务器.并且当服务重启时,duboo有服务的主动发现性能,消费者不须要重启即能够拜访新的服务.

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

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

2.5 Dubbo负载平衡策略

Dubbo负载平衡形式

@RestController
public class UserController {

//利用dubbo的形式为接口创立代理对象 利用rpc调用//@Reference(loadbalance = "random")            //默认策略  负载平衡随机策略//@Reference(loadbalance = "roundrobin")        //轮询形式//@Reference(loadbalance = "consistenthash")    //一致性hash  消费者绑定服务器提供者@Reference(loadbalance = "leastactive")            //筛选以后负载小的服务器进行拜访private UserService userService; 

}

3.径套我的项目Duboo革新
3.1.革新JT-SSO
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 创立DubboUserService接口

创立提供者实现类

编辑提供者YML配置文件

server:
port: 8093
servlet:

context-path: /

spring:
datasource:

#引入druid数据源#type: com.alibaba.druid.pool.DruidDataSourcedriver-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=trueusername: rootpassword: 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-Serviceport: 20880  #每一个服务都有本人特定的端口 不能反复.

3.2.1 革新服务消费者JT-WEB

3.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

用户模块实现

1.用户注册

1.1url剖析

1.2页面js剖析

1.3编辑UserController

/**

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

1.4编辑UserService

/**

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

1.5页面展现成果

注册胜利

1.6对于zk数据的存储构造

4.4 用户单点登陆实现

4.5 页面js剖析

4.6 编辑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")@ResponseBodypublic 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.7 编辑UserService

/**

 * 1.获取用户信息校验数据库中是否有记录 * 2.有  开始执行单点登录流程 * 3.没有 间接返回null即可 * @param user * @return */@Overridepublic 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;    }}