团队接到一个项目,项目要求使用国化产数据库和国产化操作系统,之前没有使用过,于是简单研究了一下。由于项目采用微服务架构,需要考虑注册中心(nacos)对国产数据库的支持,相应的进行配置调整。
nacos原生支持内存数据库和mysql数据库,并不支持达梦或是人大金仓数据库。于是网上找了一遍,几篇文章都是说要修改nacos源码,以增加自定义驱动。
于是我按文章所写,下载并修改了nacos源码,正准备测试之际,突然想到这种做法不太友好,有没有别的办法?
问题的关键在于两点:
1、如何在nacos中加载数据库驱动JAR包?
2、如何修改nacos的数据库驱动配置?
解决方案:
1、在nacos启动时,额外加载外部JAR包。
2、在nacos启动的环境变量中,找到设置数据库驱动类的变量
由于本项目采用Docker+Docker-compose进行容器化部署,在不修改nacos源码的情况下,采用官方Docker镜像进行容器配置,具体配置如下:
nacos容器的Docker-compose配置(人大金仓数据库示例)
nacos:
image: nacos/nacos-server:v2.2.0
container_name: nacos
environment:
MODE: standalone
JVM_XMS: 512m
JVM_XMX: 512m
JVM_XMN: 256m
DB_POOL_CONFIG_DRIVERCLASSNAME: com.kingbase8.Driver
JAVA_OPT: "${JAVA_OPT} -Dloader.path=/home/nacos/libs"
volumes:
- /docker/nacos/libs/kingbase8-8.6.0.jar:/home/nacos/libs/kingbase8-8.6.0.jar
- /docker/nacos/conf/application.properties:/home/nacos/conf/application.properties
- /docker/nacos/logs/:/home/nacos/logs
privileged: true
restart: always
network_mode: "host"
配置解析:
1.该环境变量DB_POOL_CONFIG_DRIVERCLASSNAME可以设置nacos的数据库驱动类。
2.该挂载配置/docker/nacos/libs/kingbase8-8.6.0.jar:/home/nacos/libs/kingbase8-8.6.0.jar往nacos容器中增加驱动包
3.该环境变量JAVA_OPT: "${JAVA_OPT} -Dloader.path=/home/nacos/libs"将会使得nacos在启动时加载/home/nacos/libs目录下的jar包。这里要特别说明一下,这里能够使用loader.path变量,是基于nacos的console模块的pom.xml文件中的插件spring-boot-maven-plugin配置了<layout>ZIP</layout>属性,否则loader.path变量无法生效,从这个意义上来说,nacos原生支持启动时加载外部jar包。
nacos服务的配置application.properties(人大金仓数据库示例)
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:kingbase8://192.168.0.17:54321/nacos_config?allowEncodingChanges=true&clientEncoding=UTF8
db.user.0=system
db.password.0=123456
配置解析:
1.spring.datasource.platform=mysql这个配置写的是mysql,实际上在此处与mysql无关,仅仅表示为使用外部数据库来存储nacos数据。
2.db.url.0=jdbc:kingbase8://192.168.0.17:54321/nacos_config?allowEncodingChanges=true&clientEncoding=UTF8这个配置有个坑,人大金仓数据库的客户端编码,默认使用jvm编码,而jvm编码与数据库编码不一致,会导致连不上数据库,nacos启动会报No DataSource Set的异常,因而在此处URL后面配置客户端编码clientEncoding=UTF8,根据人大金仓官方文档,这个参数默认不可修改,还需要设置allowEncodingChanges=true才允许修改。
最后,需要注意的就是nacos建表语句。nacos默认提供的是mysql数据库的建表语句示例,并且不同版本的nacos的建表语句会有差异。
基于nacos 2.2.0的人大金仓数据库的建表语句示例。
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info */
/******************************************/
CREATE TABLE config_info (
id integer AUTO_INCREMENT NOT NULL,
data_id varchar (255) NOT NULL ,
group_id varchar(128) DEFAULT NULL,
content text NOT NULL ,
md5 varchar(32) DEFAULT NULL ,
gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
src_user text ,
src_ip varchar(20) DEFAULT NULL ,
app_name varchar(128) DEFAULT NULL,
tenant_id varchar(128) DEFAULT '',
c_desc varchar(255) DEFAULT NULL,
c_use varchar(64) DEFAULT NULL,
effect varchar(64) DEFAULT NULL,
type varchar(64) DEFAULT NULL,
c_schema text,
encrypted_data_key text
) ;
COMMENT ON TABLE config_info IS 'config_info';
COMMENT ON COLUMN config_info.gmt_create IS '创建时间';
COMMENT ON COLUMN config_info.gmt_modified IS '修改时间';
COMMENT ON COLUMN config_info.src_user IS 'source user';
COMMENT ON COLUMN config_info.src_ip IS 'source ip';
COMMENT ON COLUMN config_info.tenant_id IS '租户字段';
COMMENT ON COLUMN config_info.encrypted_data_key IS '秘钥';
ALTER TABLE config_info ADD CONSTRAINT pk_config_info primary key (ID) ENABLE VALIDATE;
ALTER TABLE config_info ADD CONSTRAINT uk_configinfo_datagrouptenant UNIQUE (
data_id,group_id,tenant_id
) ENABLE VALIDATE;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_aggr */
/******************************************/
CREATE TABLE config_info_aggr (
id integer AUTO_INCREMENT NOT NULL ,
data_id varchar(255) NOT NULL ,
group_id varchar(128) NOT NULL ,
datum_id varchar(255) NOT NULL ,
content text NOT NULL ,
gmt_modified datetime NOT NULL ,
app_name varchar(128) DEFAULT NULL,
tenant_id varchar(128) DEFAULT ''
) ;
COMMENT ON TABLE config_info_aggr IS '增加租户字段';
COMMENT ON COLUMN config_info_aggr.content IS '内容';
COMMENT ON COLUMN config_info_aggr.gmt_modified IS '修改时间';
COMMENT ON COLUMN config_info_aggr.tenant_id IS '租户字段';
ALTER TABLE config_info_aggr ADD CONSTRAINT pk_config_info_aggr primary key (id) ENABLE VALIDATE;
ALTER TABLE config_info_aggr ADD CONSTRAINT uk_configinfoaggr_datagrouptenantdatum UNIQUE (
data_id,group_id,tenant_id,datum_id
) ENABLE VALIDATE;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_beta */
/******************************************/
CREATE TABLE config_info_beta (
id integer AUTO_INCREMENT NOT NULL ,
data_id varchar(255) NOT NULL ,
group_id varchar(128) NOT NULL ,
app_name varchar(128) DEFAULT NULL ,
content text NOT NULL ,
beta_ips text DEFAULT NULL ,
md5 varchar(32) DEFAULT NULL ,
gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
src_user text ,
src_ip varchar(20) DEFAULT NULL ,
tenant_id varchar(128) DEFAULT '' ,
encrypted_data_key text
);
COMMENT ON TABLE config_info_beta IS 'config_info_beta';
COMMENT ON COLUMN config_info_beta.gmt_create IS '创建时间';
COMMENT ON COLUMN config_info_beta.gmt_modified IS '修改时间';
COMMENT ON COLUMN config_info_beta.src_user IS 'source user';
COMMENT ON COLUMN config_info_beta.tenant_id IS '租户字段';
COMMENT ON COLUMN config_info_beta.encrypted_data_key IS '秘钥';
ALTER TABLE config_info_beta ADD CONSTRAINT pk_config_info_beta primary key (id) ENABLE VALIDATE;
ALTER TABLE config_info_beta ADD CONSTRAINT uk_configinfobeta_datagrouptenant UNIQUE (
data_id,group_id,tenant_id
) ENABLE VALIDATE;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_tag */
/******************************************/
CREATE TABLE config_info_tag (
id integer AUTO_INCREMENT NOT NULL ,
data_id varchar(255) NOT NULL ,
group_id varchar(128) NOT NULL ,
tenant_id varchar(128) DEFAULT '' ,
tag_id varchar(128) NOT NULL ,
app_name varchar(128) DEFAULT NULL ,
content text NOT NULL ,
md5 varchar(32) DEFAULT NULL ,
gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
src_user text ,
src_ip varchar(20) DEFAULT NULL
) ;
COMMENT ON TABLE config_info_tag IS 'config_info_tag';
COMMENT ON COLUMN config_info_tag.gmt_create IS '创建时间';
COMMENT ON COLUMN config_info_tag.gmt_modified IS '修改时间';
COMMENT ON COLUMN config_info_tag.src_user IS 'source user';
COMMENT ON COLUMN config_info_tag.src_ip IS 'source ip';
ALTER TABLE config_info_tag ADD CONSTRAINT pk_config_info_tag primary key (id) ENABLE VALIDATE;
ALTER TABLE config_info_tag ADD CONSTRAINT uk_configinfotag_datagrouptenanttag UNIQUE (
data_id,group_id,tenant_id,tag_id
) ENABLE VALIDATE;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_tags_relation */
/******************************************/
CREATE TABLE config_tags_relation (
id bigint NOT NULL ,
tag_name varchar(128) NOT NULL ,
tag_type varchar(64) DEFAULT NULL ,
data_id varchar(255) NOT NULL ,
group_id varchar(128) NOT NULL ,
tenant_id varchar(128) DEFAULT '' ,
nid integer AUTO_INCREMENT NOT NULL
) ;
COMMENT ON TABLE config_tags_relation IS 'config_tag_relation';
ALTER TABLE config_tags_relation ADD CONSTRAINT pk_config_tags_relation primary key (nid) ENABLE VALIDATE;
ALTER TABLE config_tags_relation ADD CONSTRAINT uk_configtagrelation_configidtag UNIQUE (
id,tag_name,tag_type
) ENABLE VALIDATE;
CREATE INDEX idx_tenant_id ON config_tags_relation USING BTREE (tenant_id) TABLESPACE sys_default;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = group_capacity */
/******************************************/
CREATE TABLE group_capacity (
id integer NOT NULL AUTO_INCREMENT ,
group_id varchar(128) NOT NULL DEFAULT '' ,
quota integer NOT NULL DEFAULT '0' ,
usage integer NOT NULL DEFAULT '0' ,
max_size integer NOT NULL DEFAULT '0' ,
max_aggr_count integer NOT NULL DEFAULT '0' ,
max_aggr_size integer NOT NULL DEFAULT '0' ,
max_history_count integer NOT NULL DEFAULT '0' ,
gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ;
COMMENT ON TABLE group_capacity IS '集群、各Group容量信息表';
COMMENT ON COLUMN group_capacity.id IS '主键ID';
COMMENT ON COLUMN group_capacity.group_id IS 'Group ID,空字符表示整个集群';
COMMENT ON COLUMN group_capacity.quota IS '配额,0表示使用默认值';
COMMENT ON COLUMN group_capacity.usage IS '使用量';
COMMENT ON COLUMN group_capacity.max_size IS '单个配置大小上限,单位为字节,0表示使用默认值';
COMMENT ON COLUMN group_capacity.max_aggr_count IS '聚合子配置最大个数,,0表示使用默认值';
COMMENT ON COLUMN group_capacity.max_aggr_size IS '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值';
COMMENT ON COLUMN group_capacity.max_history_count IS '最大变更历史数量';
COMMENT ON COLUMN group_capacity.gmt_create IS '创建时间';
COMMENT ON COLUMN group_capacity.gmt_modified IS '修改时间';
ALTER TABLE group_capacity ADD CONSTRAINT pk_group_capacity primary key (id) ENABLE VALIDATE;
ALTER TABLE group_capacity ADD CONSTRAINT uk_group_id UNIQUE (
group_id
) ENABLE VALIDATE;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = his_config_info */
/******************************************/
CREATE TABLE his_config_info (
id bigint NOT NULL,
nid bigint NOT NULL AUTO_INCREMENT,
data_id varchar(255) NOT NULL,
group_id varchar(128) NOT NULL,
app_name varchar(128) DEFAULT NULL ,
content text NOT NULL,
md5 varchar(32) DEFAULT NULL,
gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
src_user text,
src_ip varchar(20) DEFAULT NULL,
op_type char(10) DEFAULT NULL,
tenant_id varchar(128) DEFAULT '' ,
encrypted_data_key text
) ;
COMMENT ON TABLE his_config_info IS '多租户改造';
COMMENT ON COLUMN his_config_info.tenant_id IS '租户字段';
COMMENT ON COLUMN his_config_info.encrypted_data_key IS '秘钥';
ALTER TABLE his_config_info ADD CONSTRAINT pk_his_config_info primary key (nid) ENABLE VALIDATE;
CREATE INDEX idx_gmt_create ON his_config_info USING BTREE (gmt_create) TABLESPACE sys_default;
CREATE INDEX idx_gmt_modified ON his_config_info USING BTREE (gmt_modified) TABLESPACE sys_default;
CREATE INDEX idx_did ON his_config_info USING BTREE (data_id) TABLESPACE sys_default;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = tenant_capacity */
/******************************************/
CREATE TABLE tenant_capacity (
id bigint NOT NULL AUTO_INCREMENT ,
tenant_id varchar(128) NOT NULL DEFAULT '' ,
quota integer NOT NULL DEFAULT '0' ,
usage integer NOT NULL DEFAULT '0' ,
max_size integer NOT NULL DEFAULT '0' ,
max_aggr_count integer NOT NULL DEFAULT '0' ,
max_aggr_size integer NOT NULL DEFAULT '0' ,
max_history_count integer NOT NULL DEFAULT '0' ,
gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ;
COMMENT ON TABLE tenant_capacity IS '租户容量信息表';
COMMENT ON COLUMN tenant_capacity.id IS '主键ID';
COMMENT ON COLUMN tenant_capacity.tenant_id IS 'Tenant ID';
COMMENT ON COLUMN tenant_capacity.quota IS '配额,0表示使用默认值';
COMMENT ON COLUMN tenant_capacity.usage IS '使用量';
COMMENT ON COLUMN tenant_capacity.max_size IS '单个配置大小上限,单位为字节,0表示使用默认值';
COMMENT ON COLUMN tenant_capacity.max_aggr_count IS '聚合子配置最大个数';
COMMENT ON COLUMN tenant_capacity.max_aggr_size IS '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值';
COMMENT ON COLUMN tenant_capacity.max_history_count IS '最大变更历史数量';
COMMENT ON COLUMN tenant_capacity.gmt_create IS '创建时间';
COMMENT ON COLUMN tenant_capacity.gmt_modified IS '修改时间';
ALTER TABLE tenant_capacity ADD CONSTRAINT pk_tenant_capacity primary key (id) ENABLE VALIDATE;
ALTER TABLE tenant_capacity ADD CONSTRAINT uk_tenant_id UNIQUE (
tenant_id
) ENABLE VALIDATE;
CREATE TABLE tenant_info (
id bigint NOT NULL AUTO_INCREMENT ,
kp varchar(128) NOT NULL ,
tenant_id varchar(128) default '' ,
tenant_name varchar(128) default '' ,
tenant_desc varchar(256) DEFAULT NULL ,
create_source varchar(32) DEFAULT NULL ,
gmt_create bigint NOT NULL ,
gmt_modified bigint NOT NULL
) ;
COMMENT ON TABLE tenant_info IS 'tenant_info';
COMMENT ON COLUMN tenant_info.gmt_create IS '创建时间';
COMMENT ON COLUMN tenant_info.gmt_modified IS '修改时间';
ALTER TABLE tenant_info ADD CONSTRAINT pk_tenant_info primary key (id) ENABLE VALIDATE;
ALTER TABLE tenant_info ADD CONSTRAINT uk_tenant_info_kptenantid UNIQUE (
kp,tenant_id
) ENABLE VALIDATE;
CREATE INDEX idx_tenant_id_2 ON tenant_info USING BTREE (tenant_id) TABLESPACE sys_default;
insert into tenant_info(id, kp, tenant_id, tenant_name, tenant_desc, create_source, gmt_create, gmt_modified) values
(1, '1', 'dev', 'dev', '开发环境', NULL, 1641741270448, 1641741287236),
(2, '1', 'prod', 'prod', '生产环境', NULL, 1641741270448, 1641741287236),
(3, '1', 'test', 'test', '测试环境', NULL, 1641741270448, 1641741287236);
CREATE TABLE users (
username varchar(50) NOT NULL PRIMARY KEY,
password varchar(500) NOT NULL,
enabled boolean NOT NULL
);
CREATE TABLE roles (
username varchar(50) NOT NULL,
role varchar(50) NOT NULL,
constraint uk_username_role UNIQUE (username,role)
);
CREATE TABLE permissions (
role varchar(50) NOT NULL,
resource varchar(512) NOT NULL,
action varchar(8) NOT NULL,
constraint uk_role_permission UNIQUE (role,resource,action)
);
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
达梦数据库请根据上面代码示例自行调整即可。
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
我可以在Azure网站上部署RubyonRails吗? 最佳答案 还没有。目前仅支持.NET和PHP。 关于ruby-on-rails-RubyonRails可以部署在Azure网站上吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12964010/
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon