1 Dubbo框架通讯的方式
说明:只要使用Dubbo框架 ,在内部使用了dubbo协议进行通讯,其中的IP地址是动态生成的.并且端口号是访问服务的唯一标识信息.
2 ZK存储数据的结构
说明:zk中的数据的存储的方式是树形结构的.一般三级.
3 关于负载均衡的说明
3.1 集中式的负载均衡
说明:由于nginx处于负载均衡的中心,所以什么样的服务都会经过nginx之后转向到不同的服务器中. 所以会造成nginx的负载压力很大.
nginx的主要的作用是反向代理.
3.2 客户端的负载均衡
说明:在微服务调用过程中每个服务的消费者都可以在客户端实现负载均衡的操作,在每次请求之前通过服务列表获取将要访问的服务信息.实现了压力私有化.
3.3 Dubbo负载均衡的方式
名称都是类名的前半部分都小写即可.
1.RandomLoadBalance 随机负载均衡 语法: random 默认的
2.RoundRobinLoadBalance 轮询策略 语法: roundrobin
3.ConsistentHashLoadBalance 一致性hash算法 将消费者与服务提供者绑定 语法: consistenthash
4.LeastActiveLoadBalance 挑选负载压力小的服务器进行访问 语法: leastactive
项目Dubbo改造
1 改造计划
1.jt-common充当接口项目
2.jt-sso 充当用户的提供者 服务端口号20880 服务名称 provider-sso 接口DubboUserService
3.jt-web 充当用户的消费者
2 导入Dobbu jar包
<!--引入dubbo配置 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
3 编辑Dubbo接口
说明:在jt-common中添加Dubbo的业务接口
4 编辑jt-sso的服务提供者
4.1 编辑Service实现类
4.2 编辑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的支持
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-sso #一个接口对应一个服务名称
registry: #zk集群 主机中的信息与从机中的信息一致的 从zk中获取数据的时候链接的从机 主机的作用就是监控集群
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 #每一个服务都有自己特定的端口 不能重复.
5 编辑服务消费者
5.1 编辑UserController
注入UserService注解
5.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
用户模块实现
1 用户注册
1.1 页面分析
1.2 页面JS分析
说明:根据页面url地址 查找页面JS的位置
1.3 编辑UserController
/**
* 完成用户注册操作.
* url地址: http://www.jt.com/user/doRegister
* 参数: {password:_password,username:_username,phone:_phone}
* 返回值: SysResult对象 返回的是JSON串
* 业务说明:通过dubbo框架将user信息RPC传入jt-sso实现数据的入库操作.
* */
@RequestMapping("/doRegister")
@ResponseBody
public SysResult saveUser(User user){
dubboUserService.saveUser(user);
return SysResult.success();
}
1.4 编辑UserService
package com.jt.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
@Service //dubbo的注解
public class DubboUserServiceImpl implements DubboUserService{
@Autowired
private UserMapper userMapper;
/**
* 1.邮箱暂时使用电话号码代替
* 2.需要将密码进行加密处理 md5/md5-hash
* @param user
* @return
*/
@Override
@Transactional
public void saveUser(User user) {
//1.获取明文
String password = user.getPassword();
//2.利用Spring的工具API进行加密操作
password = DigestUtils.md5DigestAsHex(password.getBytes());
user.setPassword(password).setEmail(user.getPhone());
userMapper.insert(user);
}
}
1.4 关于POJO转化异常说明
报错说明: 由于SpringBoot配置了热部署的工具,当代码进行修改之后,程序就会重新启动. 在重启的过程中程序又会再次链接zookeeper注册中心.由于zk的心跳检测机制存在超时时间,可能在zk中会出现2条一模一样的服务的提供者的信息.
解决方案: 需要手动的重启服务器即可.