重磅官宣,OpenHarmony技术峰会来了

在生产环境中应用Camunda工作流,通常都需要配置多个工作流引擎实例,以满足负载分担,容灾备份等需求。这里我将用nacos+nginx,来实现多个工作流引擎的服务注册和负载分担。

我采用spring boot集成的方式来启动Camunda工作流,具体做法可以参照我之前的文章, Springboot集成Camunda流程引擎_gzroy的博客-CSDN博客_camunda的流程引擎运行方式,这里我做了一点改进,就是在springboot项目中增加一个API,可以读取当前运行的工作流引擎的端口,这样之后我们设置负载分担之后,可以帮我们判断流量是否去到不同的引擎。

按照官网的说明,camunda是采用了Jersey来实现Rest API,因此我们也要采用这个方式来增加新的API。

在springboot项目中新建一个config文件夹,里面新增一个JerseyConfig.java文件,内容如下:

package com.roy.camunda.config;

import javax.ws.rs.ApplicationPath;

import org.camunda.bpm.spring.boot.starter.rest.CamundaJerseyResourceConfig;
import org.springframework.stereotype.Component;

import com.roy.camunda.service.TestService;

@Component
@ApplicationPath("/engine-rest")
public class JerseyConfig extends CamundaJerseyResourceConfig {
  @Override
  protected void registerAdditionalResources() {
    register(TestService.class);
  }
}

这个类扩展了CamundaJerseyRerouceConfig, 并注册了一个新的名为TestService的API资源。

新建一个service文件夹,在里面新建一个TestService.java,内容如下:

package com.roy.camunda.service;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;

@Service
@Path("/test")
public class TestService {
    @Autowired
    Environment environment;

    @GET
    @Produces("text/plain")
    public String test() {
        return "The running engine port is:" + environment.getProperty("local.server.port");
    }
}

下一步我们要实现把这个工作流引擎的服务实例的信息自动注册到nacos,nacos是阿里推出的一个开源的实现spring cloud微服务注册中心和配置中心的软件。

修改一下刚才我们的springboot项目,在pom.xml里面的dependancyManagement里面增加以下配置:

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-alibaba-dependencies</artifactId>
	<version>2.2.9.RELEASE</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>

在dependancies里面增加以下配置:

<dependency>
    <groupId>com.alibaba.boot</groupId>
	<artifactId>nacos-discovery-spring-boot-starter</artifactId>
	<version>0.2.12</version>
</dependency>

在application.yml文件中增加以下配置:

spring:
  application:
    name: camunda-service

nacos:
  discovery:
    auto-register: true
    register:
      ip: 127.0.0.1
      port: 8081
      enabled: true
      groupName: CAMUNDA
    server-addr: 127.0.0.1:8848

这里面的配置对应实际的nacos服务器的配置。

完成之后,我们在两个终端中分别运行

mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8080以及mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8081,启动两个camunda引擎实例,这两个实例分别运行在本地的8080和8081端口。

之后在nacos的控制台的服务列表中,我们就可以看到一个名为camunda-service的服务,服务的实例为两个,服务详情里面可以看到对应的服务器IP和端口。

最后就是在Nginx里面进行设置了,在sites-available的default文件里面,增加一个配置:

upstream camunda {
    server 127.0.0.1:8081;
    server 127.0.0.1:8080;
}

然后在server的配置里面增加

location /camunda/engine-rest {
    proxy_pass http://camunda/camunda/engine-rest;
}

现在,当我们访问http://localhost/camunda/engine-rest/test的时候,我们可以看到返回当前运行camunda引擎的端口号,反复调用多次,可以看到端口号会返回8080或8081,因此可以证明现在已经实现了两个引擎的负载分担了。

还有另一种方法验证负载分担,那就是在Spring boot项目的application.yml中增加以下配置:

logging.level.org.camunda.bpm:
  application: DEBUG
  engine.context: DEBUG

然后我们启动两个工作流实例,可以看到会在两个引擎里面分别运行。

我们可以进一步完善,利用Nginx的插件来自动调用nacos的API,定期查询当前注册的服务的IP和端口号,并自动更新Nginx的配置,实现自动发现服务和更新。

猜你喜欢

转载自my.oschina.net/u/5283003/blog/7782420