1. Zookeeper集群搭建
说明: Zookeeper集群中leader负责监控集群状态,follower主要负责客户端链接获取服务列表信息.同时参与投票.
1.1 测试Zookeeper高可用
选举原则: myid最大值优先
2. Dubbo
Dubbo是阿里巴巴公司开源的一款高性能、轻量级的开源Java 微服务(SOA思想)框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。
Dubbo提供了六大核心能力:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。
2.1 入门测试案例
2.1.1 导入项目包,并加入Maven project
2.2 关于Dubbo框架环境配置
2.2.1 定义中立接口
2.2.2 定义两个服务生产者
2.2.3 关键yml配置文件
#关于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.2.4 定义服务消费者
2.2.5 定义服务生产者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.3 案例测试
3. 关于Dubbo负载均衡说明
3.1 集中式负载均衡
用户不清楚自己应该访问哪台服务器,只有经过负载均衡处理之后才能被转向
典例: nginx
目的: 主要用于访问首页
3.2 客户端负载均衡
由客户端自己进行负载均衡,客户端根据负载均衡结果自行访问服务器
目的: 主要用于访问业务服务器
典例: Dubbo
3.3 Dubbo负载均衡种类
由于Dubbo框架是客户端负载均衡机制,所以具体配置在客户端.
3.3.1 一致性hash算法
类名: ConsistentHashLoadBalance
作用: 将客户端与服务器绑定,通过一致性hash算法绑定具体服务器
3.3.2 最少访问
类名: LeastactiveLoadBalance
作用: 对服务器筛选,寻找最少访问压力的服务器进行访问
3.3.3 随机算法
类名: RandomLoadBalance
作用: 随机实现负载均衡
3.3.4 轮询机制
类名: RoundRobinLoadBalance
作用: 按照服务器顺序依次访问
4. 整合到京淘项目
4.1 创建接口类
4.3 定义服务接口
4.4 编辑yml文件
server:
port: 8091
servlet:
context-path: /
spring:
datasource:
#url: jdbc:mysql://192.168.126.129:8066/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
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
main:
banner-mode: off
#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: 20880 #每一个服务都有自己特定的端口 不能重复.
4.4 定义消费者
4.4.1 编辑ItemController
4.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
5. 实现商品数据的展现
5.1 实现商品页面的跳转
5.1.2 编辑ItemController
@Controller //跳转商品页面
public class ItemController {
//使用rcp接口
@Reference(check = false)//check = false,表示当先启动消费者时暂时不去校验生产者是否启动
private DubboItemService itemService;
/**
* 实现商品页面跳转
* url: http://www.jt.com/items/562379.html
* 参数: 562379 商品id
* 返回值: String: item
* 页面取值: ${item.title}
* ${itemDesc.itemDesc}
*/
@RequestMapping("/items/{itemId}")
public String findItemById(@PathVariable Long itemId, Model model){
Item item = itemService.findItemById(itemId);
ItemDesc itemDesc = itemService.findItemDescById(itemId);
model.addAttribute("item", item);
model.addAttribute("itemDesc", itemDesc);
return "item";
}
}
5.1.3 编辑ItemService
@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);
}
}