第108天学习打卡(SpringBoot window下安装zookeeper he dubbo-admin 服务注册发现实战)
Dubbo 概念
什么是dubbo?
Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
官网地址:快速开始 | Apache Dubbo
服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需要的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
监控中心(Montor): 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
调用关系说明:
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供 的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
window下载安装zookeeper
1.官网地址:Index of /zookeeper (apache.org)
Index of /zookeeper/zookeeper-3.7.0 (apache.org)
注意:因为3.5以后版本的这个tar.gz是未编译的, 要选bin,tar.gz
2.运行/bin/zkServer.cmd,初次运行会报错,没有zoo.cfg配置文件
可能遇到的问题:闪退!
解决方案:编辑zkService.cmd文件末尾添加pause.这样运行出错就不会闪退,会提示错误信息,方便找到原因。
3.修改zoo.cfg配置文件
将conf文件夹下的zoo_sample.cfg复制一份改名为zoo.cfg即可
注意几个重要位置:
dataDir=./ 临时数据存储的目录(可写相对路径)
clientPort = 2181 zookeeper的端口号
修改完成之后再次启动zookeeper
4.使用zkCli.cmd测试
ls /: 列出zookeeper根下保存的所有节点
create -e/kuangshen 123 :创建一个kuangshen节点,值为123
get /kuangshen:获取/kuangshen节点的值
window下载安装dubbo-admin
dubbo本身并不是一个服务软件。它就是一个jar包,能够帮你的java程序连接到zookeeper,并利用zookeeper消费、提供服务。
但是为了让用户更好的管理监控众多的dubbo服务,官方提供一个可视化的监控程序dubbo-admin,不过这个监控即使不装也不影响使用。
下载地址:GitHub - apache/dubbo-admin at master
2,进入解压目录dubbo-admin-master\dubbo-admin\src\main\resources\application.properties指定zookeeper地址。
3,在项目目录下打包dubbo-admin
mvn clean package -Dmaven.test.skip=true
打包成功界面
4.执行dubbo-admin\target 下的dubbo-admin-0.0.1-SNAPSHOT.jar
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
注意:zookeeper的服务一定要打开
执行完毕后,访问http://localhost:7001/,这时需要输入登录账号和密码,默认账号是root,密码是root. 登录成功后,查看界面:
zookeeper:注册中心
dubbo-admin:是一个监控管理后台,查看我们注册了哪些服务,哪些服务被消费了。
Dubbo:jar包
服务注册发现实战
步骤:
前提:zookeeper服务已经开启
1.提供者提供服务
1.导入依赖
2.配置注册中心的地址,以及服务发现名,和要扫描的包
3.在想要被注册的服务上面,增加一个注解@Service
2.消费者如何消费
1.导入依赖
2.配置注册中心的地址,配置自己的服务名
3.从远程注入服务
导入依赖在pom.xml(provider-server)
<!--导入依赖:Dubbo + zookeeper-->
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!-- Zkclient-->
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
【新版的坑】zookeeper及其依赖包,解决日志冲突,还需要剔除日志依赖 导入依赖在pom.xml(provider-server)
<!-- 日志会冲突-->
<!-- 引入zookeeper-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.7.0</version>
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
service
TicketService.java
package com.kuang.service;
public interface TicketService {
public String getTicket();
}
TicketServiceImpl.java
package com.kuang.service;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
//zookeeper:服务注册与发现
@Service//可以被扫描到,在项目一启动就自动注册到注册中心
@Component //使用了Dubbo后尽量不要用Service注解 Component是万能注解
public class TicketServiceImpl implements TicketService{
@Override
public String getTicket() {
return "狂神说Java";
}
}
application.properties
server.port=8081
# 服务应用名字
dubbo.application.name=provider-server
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 哪些服务要被注册
dubbo.scan.base-packages=com.kuang.service
需要启动的两个cmd:
第一个是zkService.cmd
第二个是在这个路径下启动cmd
执行的命令:java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
最后启动provider-service ,然后访问localhost:7001
在consumer-service的pom.xml中导入的
<!-- 导入相关的依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!-- Zkclient-->
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- 日志会冲突-->
<!-- 引入zookeeper-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.7.0</version>
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
service
TicketService.java
package com.kuang.service;
public interface TicketService { //服务不需要相同,但接口需要相同
public String getTicket();
}
UserService.java
package com.kuang.service;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service //放到容器中
public class UserService {
//想拿到provider-service提供的票 ,要去注册中心拿到服务
@Reference //引用 pom坐标,可以定义路径相同的接口名
TicketService ticketService;
public void buyTicket(){
String ticket = ticketService.getTicket();
System.out.println("在注册中心拿到=>"+ticket);
}
}
application.properties
server.port=8082
# 消费者去哪里拿服务 消费者需要暴露自己的名字
dubbo.application.name=consumer-service
# 注册中心的地址,可以在任何电脑上
dubbo.registry.address=zookeeper://127.0.0.1:2181
测试:
package com.kuang;
import com.kuang.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ConsumerServiceApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.buyTicket();
}
}
回顾
三层架构 + MVC
架构---->解耦
开发框架
Spring
IOC AOP
IOC:控制反转
AOP:切面 (本质,动态代理)
为了解决什么?不影响业务本来的情况下,实现动态增加功能,大量应用在日志,事务...等等方面
spring是一个轻量级的Java开源框架,容器
目的:解决企业开发的复杂性问题
Spring:配置文件十分复杂
SpringBoot
SpringBoot并不是新东西,就是Spring的升级版
新一代JavaEE的开发标准,开箱即用 ->拿过来就可以用
它自动帮我们配置了非常多的东西,我们拿来即用!
特性:约定大于配置!
随着公司体系越来越大,用户越来越多
微服务架构---->新架构
模块化,功能化!
用户模块,支付模块, 签到模块, 娱乐模块,...;
人越来越多:一台服务器解决不了,再增加服务器!(横向)
假设A服务器占用98%资源,B服务器只占用10%。 -----需要负载均衡
将原来的整体项目,分成模块化,用户就是一个单独的项目,签到也是一个单独的项目,项目和项目之间需要通信,如何通信?
用户非常多,而签到十分少! 给用户多一点服务器,给签到少一点服务器。
微服务架构问题?
分布式架构会遇到的四个核心问题?
1.这么多服务,客户端该如何去访问?
2.这么多服务,服务之间如何进行通信?
3.这么多服务,如何治理呢?
4.服务挂了,怎么办呢?
解决方案:
SpringCloud,是一套生态,就是来解决以上分布式架构的4个问题
想使用SpringCloud,必须掌握SpringBoot,因为SpringCloud是基于SpringBoot;
1. Spring Cloud NetFlix,出了一套解决方案! 一站式解决方案 我们都可以直接去这里拿
Api网关, zuul组件 解决上面第一个问题
Feign --> HttpClient--->Http的通信方式,同步并阻塞 解决上面第二个问题
服务注册与发现, Eureka 解决上面第三个问题
熔断机制, Hystrix 解决上面第四个问题
2.Apache Dubbo zookeper, 第二套解决系统
API: 没有!要么找第三方组件,要么自己实现
Dubbo是一个高性能的基于Java实现的,RPC通信框架。
服务注册与发现, zookeeper: 动物园管理者(Hadoop, Hive)
没有熔断机制:借助了Hystrix的
不完善,Dubbo
3.SpringCloud Alibaba 一站式解决方案
目前,又提出了一种新方案:
服务网格:下一代微服务标准,Server Mesh
代表解决方案: istio
万变不离其中,一通百通
1.API网关,服务路由
2.HTTP, RPC框架,异步调用
3.服务注册与发现, 高可用
4.熔断机制,服务降级
为什么要解决这个问题? 本质:网络不可靠!
B站学习地址:【狂神说Java】SpringBoot最新教程IDEA版通俗易懂_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili