赞
踩
微服务架构是一种设计复杂应用程序的方法,它提倡将单一应用程序开发为一组小型、独立的服务,每个服务运行在其自己的进程中,并通过轻量级通信(通常是HTTP协议)进行交互。每个服务都是围绕业务功能构建的,能够独立部署、扩展和维护。
上述说常用的服务间通信的协议是HTTP协议,但是目前很多公司里也会使用Dubbo作为RPC调用框架。
HTTP协议是存在于ISO模型中的应用层,应用层实现具体的应用功能,为应用程序提供服务。
Dubbo则是基于TCP协议的RPC架构,而TCP协议处于ISO模型的传输层,传输层只是建立、管理和维护端到端的连接。
所以在请求的过程中,TCP协议会比HTTP协议封装更少的内容,速度也比HTTP会快一些。
微服务核心特点:
Dubbo在微服务架构中不仅提供了高效的服务间通信机制,还通过其全面的服务治理能力,极大地降低了构建、管理和维护复杂微服务架构的难度
(1)Zookeeper
Zookeeper主要用于协调分布式应用,提供了一套完整的分布式协调服务解决方案。它能够为分布式应用提供命名服务、配置管理、集群管理、分布式锁、队列管理等服务。
在微服务架构中,Zookeeper可以作为一个服务注册中心,各个微服务启动后会向Zookeeper注册自己的信息(如IP地址、端口号等),而其他需要调用这些服务的应用则可以从Zookeeper上查询到服务的信息,实现服务的自动发现。
Zookeeper的核心是其数据模型和Watcher机制,通过维护一个层次化的命名空间来存储数据,并且提供了实时的数据变更通知机制。但是,Zookeeper的性能并不适合高并发场景,且其API相对复杂,需要一定的学习成本。
(2)Nacos
Nacos是阿里巴巴开源的一款易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它结合了服务发现与配置管理的功能,旨在简化微服务和DevOps的运维工作。
Nacos提供了一个强大的服务注册与发现功能,微服务可以在启动时向Nacos注册,同时Nacos也支持健康检查,确保只返回可用的服务实例。服务消费者可以通过Nacos发现并调用服务。
Nacos具有高可用性、高性能和易用性,支持动态配置更新,无需重启服务即可生效。此外,Nacos还提供了丰富的可视化界面,方便用户管理和监控服务。
1、IDEA编码工具。
2、Maven依赖管理工具
(1)下载
Zookeeper是Apache旗下的产品,下载地址:Apache Zookeeper
(2)解压并启动
将Zookeeper压缩包下载好后进行解压。
解压好后还不能直接启动,还需要修改配置文件,一个很简单的修改操作。将conf目录下的zoo_sample.cfg文件改为zoo.cfg文件
即可。
修改前:
修改后:
进入bin目录,在windows系统中直接双击zkServer.cmd文件启动Zookeeper,而在Linux系统下则需要运行zkServer.sh文件。
(1)下载
Nacos 是阿里的产品,现在是 SpringCloud 中的一个组件。它的功能要比 Eureka、Zookeeper 更加丰富,在国内比较受欢迎。
下载地址:Nacos GitHub下载地址
(2)下载后解压
(3)修改数据库配置
进入conf目录下,打开application.properties文件,需要在这里面修改数据库的配置。
在修改数据库配置之前需要走一个必不可少的流程,就是将conf目录下的mysql-schema.sql在指定的数据库中执行一次,让数据库中有所需要的表。
数据库的配置信息从33行开始。
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
spring.datasource.platform=mysql
spring.sql.init.platform=mysql
db.num=1
db.url=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456
(4)启动Nacos
在bin目录下执行指定的命令:
1、单机模式:startup.cmd -m standalone
2、集群模式:startup.cmd -m cluster
,需要开启集群模式。
看到上述情况则表示Nacos启动成功,可以访问:http://localhost:8848/nacos
,用户名和密码如果没有设置的话都是:nacos/nacos。
<?xml version="1.0" encoding="UTF-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> <parent> <groupId>com.tt</groupId> <artifactId>dubbo-demo</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <packaging>pom</packaging> <artifactId>zookeeper-registry</artifactId> <modules> <module>provider</module> <module>interface-api</module> <module>Consumer</module> </modules> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.2.12</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>3.2.5</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-zookeeper</artifactId> <version>3.2.12</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.2.5</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.32</version> <scope>provided</scope> </dependency> </dependencies> </dependencyManagement> </project>
<?xml version="1.0" encoding="UTF-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> <parent> <groupId>com.tt</groupId> <artifactId>dubbo-demo</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <packaging>pom</packaging> <artifactId>nacos-registry</artifactId> <modules> <module>nacos-interface-api</module> <module>nacos-provider</module> <module>nacos-consumer</module> </modules> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>2.7.17</spring.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.32</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2021.0.5.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
将阿里巴巴开源的高性能、轻量级的微服务框架Dubbo,与流行的Spring Boot框架结合使用,以构建分布式服务应用。这种集成可以充分利用Dubbo的RPC(远程过程调用)功能和Spring Boot的快速开发特性,实现服务的自动注册、发现、负载均衡、容错、降级等功能。
公共模块主要是提供接口和公共的对象。
// 提供公共的接口,具体业务由实现类完成。
public interface UserService {
public String userLogin(String username, String password);
}
public interface UserService {
String userLogin(String username, String password);
}
服务提供者,先导入公共模块的依赖同时实现相应的接口,并将实现类的信息上传到注册中心。
(1)导入API公共模块依赖
在服务提供者的pom文件中导入API模块的依赖
<dependency>
<groupId>com.tt</groupId>
<artifactId>nacos-interface-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
(2)实现接口,完成业务逻辑
@DubboService
public class UserServiceImpl implements UserService {
@Override
public String userLogin(String username, String password) {
// 省略具体的业务逻辑
return username + "登录成功";
}
}
@DubboService是Dubbo Spring Boot Starter提供的一个注解,用于标记一个接口的实现类为Dubbo的服务提供者。
(3)开启Dubbo服务并设置配置中心
@SpringBootApplication
@EnableDubbo // 在启动类上开启Dubbo服务
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
server: port: 8081 spring: application: name: nacos-provider cloud: nacos: config: server-addr: 127.0.0.1:8848 namespace: 2cb71f92-6787-40bd-b9df-ccc2be92e0ec file-extension: yaml discovery: server-addr: 127.0.0.1:8848 namespace: 2cb71f92-6787-40bd-b9df-ccc2be92e0ec dubbo: registry: address: nacos://${spring.cloud.nacos.config.server-addr} protocol: port: 20880 # dubbo服务端口 name: dubbo # 协议 # monitor: # protocol: registry scan: base-packages: com.tt.service
Zookeeper模式下的服务提供者除了配置文件与Nacos模式的服务提供者不同,其他基本一致。
spring: application: name: tt-provider dubbo: protocol: name: dubbo port: -1 # serialization: kryo registry: address: zookeeper://127.0.0.1:2181 application: qos-port: 2222 provider: timeout: 5000 scan: base-packages: com.tt.service
在Dubbo模式下,服务消费者调用服务提供者的路径是一个涉及多个组件和步骤的过程。下面是一个典型的调用流程概述:
(1)开启Dubbo服务并配置注册中心
@SpringBootApplication
@EnableDubbo
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
}
server: port: 8082 spring: application: name: nacos-consumer cloud: nacos: config: server-addr: 127.0.0.1:8848 namespace: 2cb71f92-6787-40bd-b9df-ccc2be92e0ec file-extension: yaml discovery: server-addr: 127.0.0.1:8848 namespace: 2cb71f92-6787-40bd-b9df-ccc2be92e0ec dubbo: registry: address: nacos://${spring.cloud.nacos.config.server-addr} protocol: port: 20880 # dubbo服务端口 name: dubbo # 协议 # monitor: # protocol: registry # scan: # base-packages: com.tt.service
(2)进行Dubbo调用
@RestController
public class UserController {
@DubboReference // 通过接口进行代理对象的注入,然后进行RPC调用
private UserService userService;
@GetMapping(value = "/login/{username}/{password}")
public String userLogin(@PathVariable("username") String username, @PathVariable("password") String password){
return userService.userLogin(username, password);
}
}
同Nacos模式下的消费者类似。
Dubbo是一个高性能、轻量级的开源微服务框架,它支持多种负载均衡策略来优化服务调用的分布,从而提高系统的整体性能和稳定性。以下是Dubbo支持的主要负载均衡策略:
在实际应用中,你可以根据服务的具体需求和场景选择合适的负载均衡策略,也可以自定义实现以满足更复杂的需求。这些策略可以通过Dubbo的配置文件或者注解来指定,例如在@Reference注解中使用loadbalance属性来指定负载均衡策略。
@RestController
public class UserController {
@DubboReference(loadbalance = "random") // 声明使用的负载均衡策略
private UserService userService;
@GetMapping(value = "/login/{username}/{password}")
public String userLogin(@PathVariable("username") String username, @PathVariable("password") String password){
return userService.userLogin(username, password);
}
}
负载均衡是分布式系统中一个关键的部分,它有助于提升系统的可用性、伸缩性和性能。
Dubbo提供了多种容错机制和重试策略,用于处理服务调用时可能遇到的故障和异常情况。这些机制可以帮助服务保持高可用性和稳定性,尤其是在分布式系统中。下面是几种主要的容错和重试策略:
在实际应用中,可以根据服务的特性和业务需求选择合适的容错策略。例如,对于查询语句,推荐使用默认的Failover策略,而对于增删改操作,建议使用Failfast策略,或者使用Failover策略但将retries设为0,以防止数据重复添加。
这些策略可以通过Dubbo的配置文件或代码中的注解来指定,例如在@DubboReference或@DubboService注解中使用cluster属性来设置容错策略。
@RestController
public class UserController {
// 随机的负载均衡策略,失败自动切换的容错机制,5次的重试机制
@DubboReference(loadbalance = "random", cluster = "failover", retries = 5)
private UserService userService;
@GetMapping(value = "/login/{username}/{password}")
public String userLogin(@PathVariable("username") String username, @PathVariable("password") String password){
return userService.userLogin(username, password);
}
}
如果项目中使用的是XML,可以使用以下写法:
<dubbo:reference id="demoService" interface="com.example.DemoService" cluster="failover" retries="2"/>
Dubbo的服务降级和服务熔断是微服务架构中用于增强系统稳定性和防止雪崩效应的关键机制。它们通过限制或改变服务调用行为,来保护系统免受异常服务实例的影响。
服务降级是指在服务调用遇到问题时,主动降低服务的功能或性能,返回一个默认或简化的响应,而不是等待服务响应或重试。这有助于避免服务调用方因等待无响应的服务而导致的资源耗尽。
在Dubbo中,服务降级可以通过多种方式实现:
@DubboReference(mock = "return null")
private MyService myService;
当myService调用失败时立马返回null。
(1)实现降级方法
public class MyServiceMock implements MyService {
@Override
public String someMethod(String param) {
return "Mocked response for: " + param;
}
}
(2)配置mock
@DubboReference(mock = "com.example.service.MyServiceMock$someMethod")
private MyService myService;
服务熔断是一种保护机制,当一个服务的调用失败率达到一定程度时,Dubbo会自动“断开”对该服务的调用,直接返回错误或预定义的响应,而不是继续尝试调用可能已失败的服务。这可以防止大量请求涌向已知有问题的服务,避免进一步的系统崩溃。
Dubbo可以通过集成Hystrix来实现服务熔断。Hystrix是Netflix开源的一个容错库,它可以监控服务调用的健康状态,并在必要时触发熔断机制。
要使用Hystrix进行熔断,你需要做以下几点:
在Dubbo中,你还可以通过配置circuitBreaker相关属性来控制熔断的行为:
@DubboReference(circuitBreaker = "on", timeout = 3000, retries = 0)
private DemoService demoService;
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。