1.安装注册中心zookeeper(Linux远程安装)(依赖java环境)
下载地址:Index of /apache/zookeeper/zookeeper-3.6.3 (bfsu.edu.cn)
上传到opt/zookeeper目录
# 1
cd /opt
# 2 创建目录
mkdir zookeeper
# 3 解压
tar -zxvf xxxx
# 4
cd apache-zookeeper-3.6.3-bin/
# 5 配置
cd conf
# 6 复制文件 zoo.cfg 才能生效
cp zoo_sample.cfg zoo.cfg
# 7 更改目录配置
vim zoo.cfg
# 8 退出保存
esc + wq!
# 9 创建刚刚那个目录用于保存数据
mkdir /opt/zookeeper/zkdata
# 10 进入bin目录
cd /opt/zookeeper/apache-zookeeper-3.6.3-bin/bin
# 11 启动
./zkServer.sh start
# 12 停止
./zkServer.sh stop
# 13 查看状态
./zkServer.sh status
启动完成记得放行2181 8222 8333端口,如果放行端口后依旧报错使用firewalld-cmd reload 重刷防火墙规则
2.创建dubbo模块(包名一定要一致)
父模块
导入依赖
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.2.1.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
</dependencies>
</dependencyManagement>
api接口模块
创建一个普通service测试接口
public interface HelloService { void sayHello(String name); }
提供者模块
依赖以及配置
<dependency>
<!--自定义接口依赖-->
<groupId>org.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
server:
port: 8081
dubbo:
application:
name: provider
registry:
address: zookeeper://124.223.93.49:2181 #服务地址
protocol:
name: dubbo
port: 20880
#提供服务类实现的包
scan:
base-packages: com.dubbo.provider.service #扫包
消费者模块和生产者一致 但是不用配置扫包
3.编写提供者提供服务的实现以及消费者如何远程调用的
提供者
import org.apache.dubbo.config.annotation.Service;
@Service
public class HelloServiceImp implements HelloService {
@Override
public void sayHello(String name) {
System.out.println("hello+"+name+"!");
}
}
消费者
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service
public class ProvideServiceImp implements ProviderService {
@Reference
private HelloService helloService;
@Override
public void providerTest() {
helloService.sayHello("xzh");
}
}
效果就是调用消费者 会发现生产者确实被调用 自此学习成功。
4.dubbo的几种高级特性
地址缓存
-
定义:
升访问速度,提升用户体验
-
原理
- dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后在调用则不会访问注册中心。
- 一旦当服务提供者地址发生变化时,注册中心会通知服务消费者。
-
使用
自动使用,无需操作。
超时与重试
@Service(timeout = 1000,retries = 2)
为了解决高可用,提高用户的体验,防止服务器宕机引发的雪崩效应。
原理
没有这个机制的话,当消费者调用提供者提供的服务时,如果发生阻塞,那么会一直等待,当请求越积越多,那么就会影发雪崩,造成服务器宕机。至于重试就是当连接不成功时,消费者的执行策略,如一直重试等。
使用
在@Server与@Reference注解中配置,消费者配置能够容忍的超时时间,提供者配置正常执行大致所需时间。
多版本
灰度发布
@Service(version = "1.1")
public class HelloServiceImp implements HelloService {
@Override
public void sayHello(String name) {
System.out.println("hello+"+name+"!");
}
}
拷贝一份
@Service(version = "1.2")
public class HelloServiceImp2 implements HelloService {
@Override
public void sayHello(String name) {
System.out.println("hello+"+name+"!");
}
}
负载均衡
@Reference(loadbalance = "random")
-
定义
为了控制集群中每台服务器的压力,达到合理分配请求的方式。
-
原理
因为集群中每台服务器配置的项目都是一样的,所有在访问的时候,如果全部请求都往一台服务器请求,那么就有可能造成服务器压力过大,造成宕机。
集群容错
@Reference(cluster = "failover")
-
定义
在集群的前提下,当服务消费者调用提供者的服务失败的时候,消费者的执行策略。
-
目的
为了提高可用性以及用户的体验性。
-
集群容错模式
Failover Cluster
失败重试。默认值。当出现失败,重试其它服务器 ,默认重试2次,使用 retries 配置。一般用于读操作
Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于写操作
Failsafe Cluster
失败安全,出现异常时,直接忽略。返回一个空结果。
Failback Cluster
服务降级
定义
可以通过服务降级功能临时屏蔽某个出错的非关键服务,或者屏蔽非核心服务,让服务器资源全力维持核心服务,并定义降级后的返回策略。
目的
能够控制服务器的资源分配,或者当某个服务出现紧急异常时,需要屏蔽用户发起的请求。
使用
在服务消费方的@Reference中配置使用。
两种降级配置
mock=force:return null
表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
mock=fail:return null
表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。