文章目录
1.软件连接
链接:https://pan.baidu.com/s/11NpCRyMxKbTOXzI_CB8IwQ
提取码:ktbp
复制这段内容后打开百度网盘手机App,操作更方便哦
2.Dubbo
2.1 Dubbo的优缺点
2.2 Dubbo架构的原理
2.3 RPC框架中负载均衡是如何设计的
2.4 基于Zookeeper实现Dubbo动态负载均衡
2.5 简单消费调用生产的环境搭建
product服务
public interface UserService {
public String getList(Integer id);
}
依赖
<dependencies>
<!-- public -->
<dependency>
<groupId>com.itmayiedu</groupId>
<artifactId>itmayiedu-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.6</version>
</dependency>
<!-- 添加zk客户端依赖 -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
## 同时添加dubbo-service的依赖
</dependencies>
serviceImpl
public class UserServiceImpl implements UserService {
public String getList(Integer id) {
System.out.println("客户端有人来消费了....");
if (id==1) {
return "william;
}
if (id==2) {
return "扎克伯格";
}
if (id==3) {
return "马化腾";
}
return "没有找到";
}
}
新增配置文件provider.xml
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="provider" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 用dubbo协议在29014端口暴露服务 -->
<dubbo:protocol name="dubbo" port="29014" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.itmayiedu.service.UserService"
ref="userService" />
<!-- 具体的实现bean -->
<bean id="userService" class="com.itmayiedu.service.impl.UserServiceImpl" />
</beans>
启动服务
public class TestMember {
public static void main(String[] args) throws IOException {
// 发布服务
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("provider.xml");
app.start();// 加载
System.out.println("服务发布成功...");
System.in.read(); // 让程序阻塞
}
}
启动服务打开zooker会发现zookerper有相关注册的信息
consumer服务
消费方的配置文件consumer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="consumer" />
<!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry protocol="zookeeper" address="zookeeper://127.0.0.1:2181" />
<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id="userService" interface="com.itmayiedu.service.UserService" />
</beans>
启动服务
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("consumer.xml");
UserService userService = (UserService) app.getBean("userService");
String name = userService.getList(1);
System.out.println("name:" + name);
2.6 搭建Dubbo-Admin平台
步骤:
1. 将dubbo-admin.zip 解压到tomcat的webapps目录下
2. 修改的dubbo-admin的WEB-INFO下面的dubbo.properties zk注册中心连接地址连接信息
3. 启动tomcat即可
dubbo.properties
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root123
dubbo.admin.guest.password=guest123
输入http://localhost:8080/dubbo-admin/
这里提供的就是连接Zookeper的连接应用
2.7 Dubbo的集群,负载均衡、容错
集群
修改端口号即可
provider.xml 端口号 <dubbo:protocol name="dubbo" port="29015" />
启动两个服务。
其中 <dubbo:application name="consumer" />
name如果相同则默认为1个相同
负载均衡
在平台进行设置
容错
可以使用keepalived脚本进行监听服务器,如果服务器停掉了,自动帮你重启,如果一直重启失败,就给你发送报警邮箱
2.8 本地负载均衡和服务器负载均衡的对比
注意:微服务当中,负载均衡一般不适用Nginx或者LVS做负载均衡,在微服务RPC远程调用框架中,服务的负载均衡都是采用本地负载均衡,根本原因是如果采用Nginx,所有的请求必须先交给Nginx然后进行转发,而本地负载均衡是从注册中心获取服务信息列表缓存在JVM,然后在本地使用RPC远程调用技术,比如HttpClient或者Netty,本地负载均衡更容易实时刷新最新的数据,所以本地的负载均衡的效率比Nginx效率高;
2.9 SpringBoot整合Dubbo
目录结构
父项目依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<curator-framework.version>4.0.1</curator-framework.version>
<zookeeper.version>3.4.13</zookeeper.version>
<dubbo.starter.version>0.2.0</dubbo.starter.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.starter.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator-framework.version}</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
itmayiedu-dubbo-api-member
public interface MemberService {
public String getUser();
}
itmayiedu-dubbo-api-member-impl
@Service
public class MemberServiceImpl implements MemberService {
@Override
public String getUser() {
return "订单服务调用会员服务接口";
}
}
配置文件
server:
port: 8080
dubbo:
application:
name: member
protocol:
name: dubbo
port: 20880
registry:
address: zookeeper://127.0.0.1:2181
scan:
base-packages: com.itmayiedu.api.member.impl
启动类
@EnableDubbo
@SpringBootApplication
public class AppMember {
public static void main(String[] args) {
SpringApplication.run(AppMember.class, args);
}
}
itmayiedu-dubbo-api-order-impl
controller
@RestController
public class OrderController {
@Reference
private MemberService memberService;
@RequestMapping("/orderToMember")
public String orderToMember() {
return memberService.getUser();
}
}
配置文件
server:
port: 8081
###dubbo 注册服务名称
dubbo:
application:
name: order
###dubbo服务地址
protocol:
name: dubbo
port: 20880
registry:
address: zookeeper://localhost:2181
consumer:
timeout: 5000
启动类
@EnableDubbo
@SpringBootApplication
public class AppOrder {
public static void main(String[] args) {
SpringApplication.run(AppOrder.class, args);
}
}
3.Dubbox
什么是Dubbox
Dubbo原本是dubbo是阿里的服务,但是后期舍弃了,被当当网利用起来,进行了一系列调整,形成了dubbox框架。他与bubb不同的是他采用的是dubbo+http协议。版本尽可能在2.8 +
代码演示
提供方
创建依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itmayiedu</groupId>
<artifactId>dubbox-consumer-producer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.4</version>
</dependency>
<!-- 添加zk客户端依赖 -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>com.itmayiedu</groupId>
<artifactId>itmayiedu-dubbo-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.7.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.0.7.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
<!-- 如果要使用json序列化 -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>3.0.7.Final</version>
</dependency>
<!-- 如果要使用xml序列化 -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>3.0.7.Final</version>
</dependency>
<!-- 如果要使用netty server -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-netty</artifactId>
<version>3.0.7.Final</version>
</dependency>
<!-- 如果要使用Sun HTTP server -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jdk-http</artifactId>
<version>3.0.7.Final</version>
</dependency>
<!-- 如果要使用tomcat server -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-logging-juli</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>com.esotericsoftware.kryo</groupId>
<artifactId>kryo</artifactId>
<version>2.24.0</version>
</dependency>
<dependency>
<groupId>de.javakaffee</groupId>
<artifactId>kryo-serializers</artifactId>
<version>0.26</version>
</dependency>
<dependency>
<groupId>de.ruedigermoeller</groupId>
<artifactId>fst</artifactId>
<version>1.55</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>7.0.0.pre5</version>
</dependency>
</dependencies>
</project>
定义一个接口
@Path("/user")
public interface UserService {
@GET
@Path("/getUser/{id : \\d+}")
//返回类型为jason
@Consumes({ MediaType.APPLICATION_JSON })
public String getUser(@PathParam("id") Integer id);
}
实现接口
public class UserServiceImpl implements UserService {
public String getUser(Integer id) {
System.out.println("被客户端(消费者)消费....id:" + id);
if (id == 1) {
return "余胜军";
}
if (id == 2) {
return "扎克伯格";
}
if (id == 1) {
return "码云";
}
return "未找到...";
}
}
创建配置文件
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="dubbox-provider" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 用rest协议在8081端口暴露服务 -->
<dubbo:protocol name="rest" port="8082" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.itmayiedu.service.UserService"
ref="userService" />
<!-- 和本地bean一样实现服务 -->
<bean id="userService" class="com.itmayiedu.service.impl.UserServiceImpl" />
</beans>
启动服务
public class TestMember {
public static void main(String[] args) throws IOException {
// 发布服务
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("provider.xml");
app.start();// 加载
System.out.println("服务发布成功...");
System.in.read(); // 让程序阻塞
}
}