虚拟电商-延迟任务系统的微服务改造(二)

一、微服务注册中心Consul

编写完延迟任务系统的web层接口,也就是说可以基于http协议来访问延迟系统,接下来要将延迟任务改造成一个服务。首要考虑的问题就是服务的注册与发现,服务的注册与发现都离不开服务的注册中心,本项目选取Consul作为注册中心。

注册中心为什么选择Consul

SpringCloud支持很多的服务发现软件,Eureka只是其中之一,常见的服务发现软件有:

Eureka

Consul

Zookeeper

Feature

etcd

Consul的特性

1.Consul是一个分布式高可用系统,他包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置功能。

2.是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。

3.内置了服务注册与发现框架,分布式一致性协议实现,健康检查,key/value存储,多数据中心方案。

4.分布式实现不需要依赖其他工具,比如Zookeeper。

5.使用Go语言编写,具备天然可移植性,支持Linux、windows和Mac OS X,安装包仅一个可执行文件。

1.1.Consul安装

启动成功后打开浏览器访问网址: http://localhost:8500/

1.2.Consul的特性

服务发现、健康检查、Key/Value存储、多数据中心

1.3.Consul的优势

1.使用Raft算法保证一致性,比复杂的Paxos算法更直接。

2.支持多数据中心,内外网的服务采用不同端口进行监听。多数据中心集群可以避免但数据中心的单点故障,而其部署则需要考虑网络延迟,分片等情况。

3.支持健康检查

4.支持HTTP和DNS协议接口

5.官方提供web管理界面

1.4.Consul的角色

Client客户端

1.无状态

2.将HTTP和DNS接口请求转发给局域网的服务端集群

server服务端

1.保存配置信息

2.高可用集群

3.在局域网内与本地客户端通信

4.通过广域网与其他数据中心通信

5.每个数据中心的server数量推荐3个或5个

Consul的服务端和客户端支持跨中心使用,更加提升了高可用性。

二、SpringCloud集成Consul

现在需要使用SpringCloud集成Consol,将延迟任务注册到注册中心,变成一个服务。目前项目都是基于SpringBoot去构建的,需要将两者版本进行对应避免在开发过程中出现一些不必要的麻烦,需要注意SpringBoot和SpringCloud的版本对应关系。

步骤一:在chongba_parent父工程的pom文件中添加SpringCloud的依赖管理

先添加properties版本号参数

xml 复制代码
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>

然后添加SpringCloud依赖坐标

xml 复制代码
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

步骤二:延迟任务系统需要在注册中心去注册,在chongba_schedule_service的pom文件中添加依赖

xml 复制代码
<!--健康检查依赖包-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--SpringCloudConsul支持包-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

步骤三:在chongba_schedule_service的application.yml配置文件中添加如下配置

xml 复制代码
spring
  cloud:
    consul:
      host: 127.0.0.1
      port: 8500
      discovery:
        serviceName: ${spring.application.name}

步骤四:启动ScheduleApplication,查看Consul的UI控制台界面

三、延迟任务Feign集成

项目目前已经使用springcloud和consol进行了集成。并且将延迟任务系统在注册中心进行了注册,已经注册成为了一个微服务。并且我们已经启动了两个节点,成功改造成了分布式。

那么我们如何去调用服务?我们不可能使用向之前那样使用PostMan 去发送http请求调用。我们需要集成Feign组件。Feign组件集成之后,我们对服务的调用就会转换为对Feign接口方法的调用,使得调用http服务更加的简单。

Feign是一个声明式的HTTP客户端,spring-cloud-openfeign将feign集成到spring boot中,在接口上通过注解声明Rest协议,就能将http调用转换为接口方法的调用,这样达到客户端调用http服务更加简单。

此外:Spring Cloud Feign还整合了Spring Cloud Ribbon (负载均衡)和Spring Cloud Hystrix(熔断器)

步骤:

步骤1:在父工程chongba_parent下创建子模块chongba_schedule_feign,单独创建一个feign模块的作用是为了让其他模块使用起来更加的方便,直接引入feign模块即可。

步骤2:在chongba_schedule_feign模块的pom文件中添加如下依赖

xml 复制代码
<dependencies>
    <dependency>
        <groupId>com.chongba</groupId>
        <artifactId>chongba_common</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
​
    <!--健康检查依赖包-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--SpringCloudConsul支持包-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
​
    <!--feign 支持 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

步骤3:在src/main/java下创建包com.chongba.feign,并在该包下创建TaskServiceClient接口,用于调用延迟任务服务schedule-service

java 复制代码
@FeignClient("schedule-service") //指定调用的服务名称
public interface TaskServiceClient {
    
    @PostMapping("/task/push")
    public ResponseMessage push(@RequestBody Task task);
    
    @GetMapping("/task/poll/{type}/{priority}")
    public ResponseMessage poll(@PathVariable("type") Integer type, @PathVariable("priority") Integer priority);
    
    @PostMapping("/task/cancel")
    public ResponseMessage cancel(@RequestParam("taskId") Long taskId);
}

下面如果想在chongba_schedule_feign工程中直接能对TaskServiceClient接口中的方法进行测试,则需要进行如下步骤的配置操作:

步骤1:在src/main/resources下创建配置文件 application.yml,并添加如下配置

xml 复制代码
spring:   
  application:  
    name: fegin #指定服务名
  cloud:
    consul:
      host: 127.0.0.1
      port: 8500
      discovery:
       register: false #不需要注册到consul

注意:feign无需在consul中注册,因为feign只需要去发现服务然后进行调用即可,自己本身并不需要称为一个服务

步骤2:在chongba_schedule_feign下创建启动类FeignAppliction

java 复制代码
@SpringBootApplication
@EnableFeignClients
public class FeignAppliction {
    public static void main(String[] args) {
        SpringApplication.run(FeignAppliction.class,args);
    }
}

步骤3:在chongba_schedule_feign工程下创建测试包:com.chongba.feign,并创建测试类TaskClientTest,添加测试方法测试添加任务

java 复制代码
@RunWith(SpringRunner.class)
@SpringBootTest(classes = FeignAppliction.class)
public class TaskClientTest {
    
    @Autowired
    private TaskServiceClient taskServiceClient;
    
    @Test
    public void test1(){
        for (int i = 0; i < 4; i++) {
            Task task  = new Task();
            task.setTaskType(2003);
            task.setParameters("testFeignClient".getBytes());
            task.setPriority(100);
            task.setExecuteTime(new Date().getTime());
            ResponseMessage reponse = taskServiceClient.push(task);
            System.out.println(reponse);
        }
    }
    @Test
    public void test2(){
        ResponseMessage message = taskServiceClient.poll(2003, 100);
        System.out.println(message);
    }
    
    @Test
    public void test3(){
        taskServiceClient.cancel(1175734747444367362L);// 从数据库或缓存中查找一个任务id
    }
}

步骤4:测试,先清空数据库和缓存,必须保证延迟任务服务是启动状态,启动两个节点:81,82,以便测试出feign对负载均衡的集成。

feign接口注意事项:

  1. 当参数比较复杂时,feign即使声明为get请求也会强行使用post请求
    HTTP 405 错误 -- 方法不被允许 (Method not allowed)
  2. 有参数时候必须使用 @RequestParam注解 必须要在后面加上参数名
相关推荐
桂月二二3 小时前
云原生服务网格:微服务通讯的量子纠缠革命
微服务·云原生·架构
Code额8 小时前
微服务的网关配置
网关·微服务·架构
极客先躯8 小时前
高级java每日一道面试题-2025年3月06日-微服务篇[Eureka篇]-Eureka服务注册与发现是什么?
java·微服务·eureka
NoneCoder11 小时前
Node.js系列(4)--微服务架构实践
微服务·架构·node.js
小涵15 小时前
【微服务】基于Lambda ESM的预留模式调整Kafka ESM吞吐量的实战
分布式·微服务·kafka·aws·lambda·cloud·云服务
南城巷陌15 小时前
使用hel-micro微服务实现在jsp项目中引入react组件
react.js·微服务·jsp·hel-micro
极客先躯1 天前
高级java每日一道面试题-2025年3月05日-微服务篇[Eureka篇]-Eureka在微服务架构中的角色?
java·微服务·架构·服务注册·健康检查·架构服务发现
TechStack 创行者1 天前
基于 Docker 和 Flask 构建高并发微服务架构
docker·微服务·容器·架构·flask
dapeng-大鹏2 天前
Gone v2 Tracer 组件-给微服务提供统一的traceID
微服务·云原生·架构·golang·traceid·gone