• 关于

    Predefined

    的搜索结果

回答

● man bc a (x) The arctangent of x, arctangent returns radians. ● bc --help usage: bc [options] [file ...] -h --help print this usage and exit -i --interactive force interactive mode -l --mathlib use the predefined math routines -q --quiet don't print initial banner -s --standard non-standard bc constructs are errors -w --warn warn about non-standard bc constructs -v --version print version information and exit

a123456678 2019-12-02 02:53:44 0 浏览量 回答数 0

问题

使用pdfbox获取pdf文件内容报错 'Adobe-WinCharSetFFF?报错

爱吃鱼的程序员 2020-06-20 17:11:19 0 浏览量 回答数 1

问题

遇到error C2676:怎么解决?c报错

爱吃鱼的程序员 2020-05-28 13:18:54 4 浏览量 回答数 1

万券齐发助力企业上云,爆款产品低至2.2折起!

限量神券最高减1000,抢完即止!云服务器ECS新用户首购低至0.95折!

问题

遇到 binary ‘> >’ : ‘class ostream_withassig怎么解决?c报错

爱吃鱼的程序员 2020-05-29 09:57:11 5 浏览量 回答数 1

回答

ReDockerFAQDocker常见问题 请问这个是什么问题啊: Warning: '-d' is deprecated, it will be removed soon. See usage. WARN[0000] please use 'docker daemon' instead.           INFO[0000] API listen on /var/run/docker.sock           INFO[0000] [graphdriver] using prior storage driver "aufs" INFO[0000] Firewalld running: false                     FATA[0000] Error starting daemon: Error initializing network controller: Error creating default "bridge" network: failed to parse pool request for address space "LocalDefault" pool "" subpool "": could not find an available predefined network

印象吧 2019-12-01 23:13:43 0 浏览量 回答数 0

问题

MaxCompute用户指南:SQL:附录:与其他SQL语法的差异

行者武松 2019-12-01 22:03:05 1298 浏览量 回答数 0

回答

从2016年开始,您应该为此使用Array.findIndex(ES2015 / ES6标准): a = [ {prop1:"abc",prop2:"qwe"}, {prop1:"bnmb",prop2:"yutu"}, {prop1:"zxvz",prop2:"qwrq"}]; index = a.findIndex(x => x.prop2 ==="yutu"); console.log(index); Google Chrome,Firefox和Edge支持该功能。对于Internet Explorer,在链接页面上有一个polyfill。 业绩说明 函数调用是昂贵的,因此对于非常大的数组,简单的循环将比findIndex: let test = []; for (let i = 0; i < 1e6; i++) test.push({prop: i}); let search = test.length - 1; let count = 100; console.time('findIndex/predefined function'); let fn = obj => obj.prop === search; for (let i = 0; i < count; i++) test.findIndex(fn); console.timeEnd('findIndex/predefined function'); console.time('findIndex/dynamic function'); for (let i = 0; i < count; i++) test.findIndex(obj => obj.prop === search); console.timeEnd('findIndex/dynamic function'); console.time('loop'); for (let i = 0; i < count; i++) { for (let index = 0; index < test.length; index++) { if (test[index].prop === search) { break; } } } console.timeEnd('loop'); 与大多数优化一样,应谨慎且仅在实际需要时才应用此优化。 问题来源于stack overflow

保持可爱mmm 2020-01-16 14:52:09 0 浏览量 回答数 0

回答

###### 引用来自“中山野鬼”的评论 引用来自“自由之信”的评论 和系统有关系,MAC OS 和 Linux 是64位的,Windows 可能是 32 位的,确定是否用了64位的系统和编译器... 一个指针的sizeof是8个byte,难道32位有这个功能吗?哈。 sizeof(va_list) == 8 ,意思是说,他采用了  typedef char * va_list; 的方式定义,而mac 和 linux 下,显然不是这么定义。。。 抱歉,我知道,因为两个的ABI接口定义不一样,所以定义的有所不同,不过这应该不影响其va_list的使用,如果使用方式正确的话,我觉得把你使用的这部分代码贴出来,看看会好一点 ###### 引用来自“ZeroOne”的评论 鬼鬼, 是否和字节对齐方式有关系? 既然va_list是一个struct. 这里有一篇百度知道不晓得是否有用: http://zhidao.baidu.com/link?url=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_aurl=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_a windows是不允许重新定义 _M_ALPHA 这个编译参数的 和字节对齐没关系哦。win下面就是 typedef char * va_list ;,我是奇怪,为什么cygwin不能按照linux下的方式处理。。。。######回复 @中山野鬼 : 恕我知道的很少,但是我看了下Cygwin里面的stdarg.h,没有的,里面有一个vararg.h,现在是空的,本来这个是Windows的定义(估计)######回复 @自由之信 : 我重复下我的问题,始终是“mac ,linux下的 va_list不是个char * ,win下是char * ,cygwin是否有正确的方式将va_list按照linux的规范来处理,而不是处理成char * ".哈######回复 @ZeroOne : 最可能是代码有问题,va_list的定义在Cygwin里面,本来就是char *,这并不影响va_list的使用######回复 @ZeroOne : 和_M_ALPHA没关系。现在也不是在谈重定义问题。哈。######没看我发给你的链接? 里面有一段话, YohanChn: 明白了,ANSI C/C++规定了6个ANSI Predefined Macros,是不能被用户定义或重定义的,而后Microsoft又补充了14个Microsoft-Specific Predefined Macros,也是不能被用户定义或重定义的。_M_ALPHA就是这14个中的一个。

kun坤 2020-05-28 09:52:25 0 浏览量 回答数 0

回答

这么晚了,我是来帮顶的。。。。真心不会C######回复 @中山野鬼 : Microsoft认为自己就是标准。######多谢多谢。。。。。。。。。真心想不出windows为什么这么变态不按posix的标准走。。。。。######留名,php是最好的语言→_→######va_list 是个啥东西啊。######这是win的问题还是cygwin的问题啊?###### 引用来自“欣儿”的评论这是win的问题还是cygwin的问题啊? WIN下,是直接使用可变参存储的指针的,这个我以前有影响,va_list params;这个参数传入子函数出来,是不变的。。。mac和linux下,va_list是一个结构体,实际可变参存储的指针是在结构体内的,所以params传入后,子函数对可变参的调整是可以在其他函数中体现出来的。 我怀疑8成是cygwin的错误。。。 ###### 和系统有关系,MAC OS 和 Linux 是64位的,Windows 可能是 32 位的,确定是否用了64位的系统和编译器... ######回复 @ZeroOne : 32bit 应该是 4,抱歉,我看错了,windows下面是char *######就算是32位吧,那结果也不应该是8,而应该是12。。。###### 引用来自“自由之信”的评论 和系统有关系,MAC OS 和 Linux 是64位的,Windows 可能是 32 位的,确定是否用了64位的系统和编译器... 一个指针的sizeof是8个byte,难道32位有这个功能吗?哈。 sizeof(va_list) == 8 ,意思是说,他采用了  typedef char * va_list; 的方式定义,而mac 和 linux 下,显然不是这么定义。。。 ###### 鬼鬼, 是否和字节对齐方式有关系? 既然va_list是一个struct. 这里有一篇百度知道不晓得是否有用: http://zhidao.baidu.com/link?url=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_aurl=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_a windows是不允许重新定义 _M_ALPHA 这个编译参数的 ###### 引用来自“中山野鬼”的评论 引用来自“自由之信”的评论 和系统有关系,MAC OS 和 Linux 是64位的,Windows 可能是 32 位的,确定是否用了64位的系统和编译器... 一个指针的sizeof是8个byte,难道32位有这个功能吗?哈。 sizeof(va_list) == 8 ,意思是说,他采用了  typedef char * va_list; 的方式定义,而mac 和 linux 下,显然不是这么定义。。。 抱歉,我知道,因为两个的ABI接口定义不一样,所以定义的有所不同,不过这应该不影响其va_list的使用,如果使用方式正确的话,我觉得把你使用的这部分代码贴出来,看看会好一点 ###### 引用来自“ZeroOne”的评论 鬼鬼, 是否和字节对齐方式有关系? 既然va_list是一个struct. 这里有一篇百度知道不晓得是否有用: http://zhidao.baidu.com/link?url=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_aurl=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_a windows是不允许重新定义 _M_ALPHA 这个编译参数的 和字节对齐没关系哦。win下面就是 typedef char * va_list ;,我是奇怪,为什么cygwin不能按照linux下的方式处理。。。。######回复 @中山野鬼 : 恕我知道的很少,但是我看了下Cygwin里面的stdarg.h,没有的,里面有一个vararg.h,现在是空的,本来这个是Windows的定义(估计)######回复 @自由之信 : 我重复下我的问题,始终是“mac ,linux下的 va_list不是个char * ,win下是char * ,cygwin是否有正确的方式将va_list按照linux的规范来处理,而不是处理成char * ".哈######回复 @ZeroOne : 最可能是代码有问题,va_list的定义在Cygwin里面,本来就是char *,这并不影响va_list的使用######回复 @ZeroOne : 和_M_ALPHA没关系。现在也不是在谈重定义问题。哈。######没看我发给你的链接? 里面有一段话, YohanChn: 明白了,ANSI C/C++规定了6个ANSI Predefined Macros,是不能被用户定义或重定义的,而后Microsoft又补充了14个Microsoft-Specific Predefined Macros,也是不能被用户定义或重定义的。_M_ALPHA就是这14个中的一个。

montos 2020-05-31 13:04:02 0 浏览量 回答数 0

回答

这么晚了,我是来帮顶的。。。。真心不会C######回复 @中山野鬼 : Microsoft认为自己就是标准。######多谢多谢。。。。。。。。。真心想不出windows为什么这么变态不按posix的标准走。。。。。######留名,php是最好的语言→_→######va_list 是个啥东西啊。######这是win的问题还是cygwin的问题啊?###### 引用来自“欣儿”的评论这是win的问题还是cygwin的问题啊? WIN下,是直接使用可变参存储的指针的,这个我以前有影响,va_list params;这个参数传入子函数出来,是不变的。。。mac和linux下,va_list是一个结构体,实际可变参存储的指针是在结构体内的,所以params传入后,子函数对可变参的调整是可以在其他函数中体现出来的。 我怀疑8成是cygwin的错误。。。 ###### 和系统有关系,MAC OS 和 Linux 是64位的,Windows 可能是 32 位的,确定是否用了64位的系统和编译器... ######回复 @ZeroOne : 32bit 应该是 4,抱歉,我看错了,windows下面是char *######就算是32位吧,那结果也不应该是8,而应该是12。。。###### 引用来自“自由之信”的评论 和系统有关系,MAC OS 和 Linux 是64位的,Windows 可能是 32 位的,确定是否用了64位的系统和编译器... 一个指针的sizeof是8个byte,难道32位有这个功能吗?哈。 sizeof(va_list) == 8 ,意思是说,他采用了  typedef char * va_list; 的方式定义,而mac 和 linux 下,显然不是这么定义。。。 ###### 鬼鬼, 是否和字节对齐方式有关系? 既然va_list是一个struct. 这里有一篇百度知道不晓得是否有用: http://zhidao.baidu.com/link?url=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_aurl=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_a windows是不允许重新定义 _M_ALPHA 这个编译参数的 ###### 引用来自“中山野鬼”的评论 引用来自“自由之信”的评论 和系统有关系,MAC OS 和 Linux 是64位的,Windows 可能是 32 位的,确定是否用了64位的系统和编译器... 一个指针的sizeof是8个byte,难道32位有这个功能吗?哈。 sizeof(va_list) == 8 ,意思是说,他采用了  typedef char * va_list; 的方式定义,而mac 和 linux 下,显然不是这么定义。。。 抱歉,我知道,因为两个的ABI接口定义不一样,所以定义的有所不同,不过这应该不影响其va_list的使用,如果使用方式正确的话,我觉得把你使用的这部分代码贴出来,看看会好一点 ###### 引用来自“ZeroOne”的评论 鬼鬼, 是否和字节对齐方式有关系? 既然va_list是一个struct. 这里有一篇百度知道不晓得是否有用: http://zhidao.baidu.com/link?url=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_aurl=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_a windows是不允许重新定义 _M_ALPHA 这个编译参数的 和字节对齐没关系哦。win下面就是 typedef char * va_list ;,我是奇怪,为什么cygwin不能按照linux下的方式处理。。。。######回复 @中山野鬼 : 恕我知道的很少,但是我看了下Cygwin里面的stdarg.h,没有的,里面有一个vararg.h,现在是空的,本来这个是Windows的定义(估计)######回复 @自由之信 : 我重复下我的问题,始终是“mac ,linux下的 va_list不是个char * ,win下是char * ,cygwin是否有正确的方式将va_list按照linux的规范来处理,而不是处理成char * ".哈######回复 @ZeroOne : 最可能是代码有问题,va_list的定义在Cygwin里面,本来就是char *,这并不影响va_list的使用######回复 @ZeroOne : 和_M_ALPHA没关系。现在也不是在谈重定义问题。哈。######没看我发给你的链接? 里面有一段话, YohanChn: 明白了,ANSI C/C++规定了6个ANSI Predefined Macros,是不能被用户定义或重定义的,而后Microsoft又补充了14个Microsoft-Specific Predefined Macros,也是不能被用户定义或重定义的。_M_ALPHA就是这14个中的一个。

kun坤 2020-06-08 11:18:47 0 浏览量 回答数 0

问题

排名数组Java

montos 2020-03-23 15:49:50 1 浏览量 回答数 1

问题

hibernate 每次获取 数据都会访问数据库?

爵霸 2019-12-01 20:05:45 1135 浏览量 回答数 1

回答

对于如此长的答案,我感到很抱歉,但是,您还有一点路要走。我会说通常情况下,您不会将数据库的存储空间与数据库本身放在相同的容器中,而是会挂载主机卷以使数据保留在Docker主机上,或者可能会使用一个容器保存数据(/ var / lib / mysql)。另外,我是mysql的新手,所以,这可能不是超级有效。那个... 我认为这里可能存在一些问题。Dockerfile用于创建映像。您需要执行构建步骤。至少,在包含Dockerfile的目录中,您将执行以下操作: docker build . Dockerfile描述了要创建的映像。我对mysql不太了解(我是一名Postgres迷),但是,我在互连网上进行了搜索,以查找“如何初始化mysql docker容器”。首先,我创建了一个新目录以供使用,我将其称为mdir,然后创建了一个文件目录,该目录存放了一个epcis_schema.sql文件,该文件创建了一个数据库和一个表: create database test; use test; CREATE TABLE testtab ( id INTEGER AUTO_INCREMENT, name TEXT, PRIMARY KEY (id) ) COMMENT='this is my test table'; 然后,我在文件目录中创建了一个名为init_db的脚本: #!/bin/bash Initialize MySQL database. ADD this file into the container via Dockerfile. Assuming you specify a VOLUME ["/var/lib/mysql"] or -v /var/lib/mysql on the docker run command… Once built, do e.g. docker run your_image /path/to/docker-mysql-initialize.sh Again, make sure MySQL is persisting data outside the container for this to have any effect. set -e set -x mysql_install_db Start the MySQL daemon in the background. /usr/sbin/mysqld & mysql_pid=$! until mysqladmin ping >/dev/null 2>&1; do echo -n "."; sleep 0.2 done Permit root login without password from outside container. mysql -e "GRANT ALL ON . TO root@'%' IDENTIFIED BY '' WITH GRANT OPTION" create the default database from the ADDed file. mysql < /tmp/epcis_schema.sql Tell the MySQL daemon to shutdown. mysqladmin shutdown Wait for the MySQL daemon to exit. wait $mysql_pid create a tar file with the database as it currently exists tar czvf default_mysql.tar.gz /var/lib/mysql the tarfile contains the initialized state of the database. when the container is started, if the database is empty (/var/lib/mysql) then it is unpacked from default_mysql.tar.gz from the ENTRYPOINT /tmp/run_db script (此脚本的大部分内容是从此处删除的:https : //gist.github.com/pda/9697520) 这是我创建的files / run_db脚本: start db set -e set -x first, if the /var/lib/mysql directory is empty, unpack it from our predefined db [ "$(ls -A /var/lib/mysql)" ] && echo "Running with existing database in /var/lib/mysql" || ( echo 'Populate initial db'; tar xpzvf default_mysql.tar.gz ) /usr/sbin/mysqld 最后,Dockerfile将它们全部绑定: FROM mysql MAINTAINER (me) Copy the database schema to the /data directory ADD files/run_db files/init_db files/epcis_schema.sql /tmp/ init_db will create the default database from epcis_schema.sql, then stop mysqld, and finally copy the /var/lib/mysql directory to default_mysql_db.tar.gz RUN /tmp/init_db run_db starts mysqld, but first it checks to see if the /var/lib/mysql directory is empty, if it is it is seeded with default_mysql_db.tar.gz before the mysql is fired up ENTRYPOINT "/tmp/run_db" 因此,我进入了我的mdir目录(该目录具有Dockerfile和files目录)。然后,我运行命令: docker build --no-cache . 您应该看到如下输出: Sending build context to Docker daemon 7.168 kB Sending build context to Docker daemon Step 0 : FROM mysql ---> 461d07d927e6 Step 1 : MAINTAINER (me) ---> Running in 963e8de55299 ---> 2fd67c825c34 Removing intermediate container 963e8de55299 Step 2 : ADD files/run_db files/init_db files/epcis_schema.sql /tmp/ ---> 81871189374b Removing intermediate container 3221afd8695a Step 3 : RUN /tmp/init_db ---> Running in 8dbdf74b2a79 + mysql_install_db 2015-03-19 16:40:39 12 [Note] InnoDB: Using atomics to ref count buffer pool pages ... /var/lib/mysql/ib_logfile0 ---> 885ec2f1a7d5 Removing intermediate container 8dbdf74b2a79 Step 4 : ENTRYPOINT "/tmp/run_db" ---> Running in 717ed52ba665 ---> 7f6d5215fe8d Removing intermediate container 717ed52ba665 Successfully built 7f6d5215fe8d 您现在有一个图像'7f6d5215fe8d'。我可以运行此图像: docker run -d 7f6d5215fe8d 图像开始,我看到一个实例字符串: 4b377ac7397ff5880bc9218abe6d7eadd49505d50efb5063d6fab796ee157bd3 然后,我可以“停止”它,然后重新启动它。 docker stop 4b377 docker start 4b377 如果您查看日志,第一行将包含: docker logs 4b377 Populate initial db var/lib/mysql/ ... 然后,在日志末尾: Running with existing database in /var/lib/mysql 这些是来自/ tmp / run_db脚本的消息,第一个消息指示数据库已从保存的(初始)版本中解压缩,第二个消息指示数据库已经存在,因此使用了现有副本。 这是我上面描述的目录结构的ls -lR。请注意,init_db和run_db是设置了执行位的脚本: gregs-air:~ gfausak$ ls -Rl mdir total 8 -rw-r--r-- 1 gfausak wheel 534 Mar 19 11:13 Dockerfile drwxr-xr-x 5 gfausak staff 170 Mar 19 11:24 files mdir/files: total 24 -rw-r--r-- 1 gfausak staff 126 Mar 19 11:14 epcis_schema.sql -rwxr-xr-x 1 gfausak staff 1226 Mar 19 11:16 init_db -rwxr-xr-x 1 gfausak staff 284 Mar 19 11:23 run_db来源:stack overflow

保持可爱mmm 2020-05-17 17:04:30 0 浏览量 回答数 0

问题

Java到底是不是一种纯面向对象语言?

技术小菜鸟 2019-12-01 21:05:36 2875 浏览量 回答数 4

回答

Nacos 服务发现提供与其他服务发现产品不太一样的机制以及概念,在这里稍作介绍,下文中的内容都会多次提到这里介绍的概念,因此掌握这些概念,对于用好 Nacos 服务发现至关重要。 不同于 Consul, Eureka, Nacos 的服务发现使用的领域数据模型是服务 - 集群 - 实例这样的三层结构。最上面是服务,注册端(服务发布者)和订阅端(服务消费者)使用服务来与其他服务做区分,服务发现中,服务是必须指定的。集群则是中间一层,一个服务又会划分为多个集群,每个集群都有它的自定义配置,Nacos 提供了一个默认集群和相应的默认配置,在不需要多集群的场景下,可以不用指定集群。最下一层是实例,每个集群又会包含多个实例,这样对服务进行发现时,可以发现多个集群的所有实例,也可以指定集群,来发现特定集群的实例。 环境准备 首先,需要有一个 Nacos Server 部署起来,目前 Nacos 支持单机模式,也支持集群模式,部署文档可以参考 Nacos 快速入门。然后添加 Nacos 客户端最新版本依赖: <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>[latest-version]</version></dependency> 你可以配置从中央仓库直接依赖,也可以将 Nacos 最新源码下载下来,本地构建客户端版本。 Hello World 我们先来进行一个最简单的服务注册与发现。Nacos 支持从客户端注册服务实例和订阅服务,具体步骤如下: 配置 Nacos 客户端 Properties:Properties properties = new Properties();properties.setProperty(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848"); 创建 Nacos Naming 客户端:NamingService namingService = NacosFactory.createNamingService(properties); 注册一个实例:namingService.registerInstance("nacos.test.1", InetAddress.getLocalHost().getHostAddress(), 8080); 查找这个服务的实例:System.out.println(namingService.getAllInstances("nacos.test.1")); 至此一个最简单的 Nacos 服务发现的使用已经完成了。这里要对一些细节稍作解释。首先在第一步中,属性 PropertyKeyConst.SERVER_ADDR 表示的是 Nacos 服务端的地址,这个地址的格式为 IP:port,IP:port。对于单机版,只需要指定一个 IP:port。甚至您可以将端口省略,这样将会访问 Nacos 的默认端口 8848。在第二步中,将创建一个 NamingService 实例,客户端将为该实例创建单独的资源空间,包括缓存、线程池以及配置等。Nacos 客户端没有对该实例做单例的限制,请小心维护这个实例,以防新建了多于预期的实例。第三步注册服务中,使用的是最简单的 API 注册方式,只需要传入服务名、IP、端口就可以。第四步是获取服务下的所有实例列表,包括健康和不健康的。 构建自定义实例 在一些场景中,我们希望注册的实例中,有一些能够被分配更多的流量,而另外一些分配较少的流量,或者能够传入一些实例的元信息存储到 Nacos 服务端,例如 IP 所属的应用或者所在的机房,这样在客户端可以根据服务下挂载的实例的元信息,来自定义负载均衡模式。别担心,我们有另外的注册实例接口,让你可以在注册的时候指定实例的属性: /** * Register a instance to service with specified instance properties * * @param serviceName name of service * @param instance instance to register * @throws NacosException / void registerInstance(String serviceName, Instance instance) throws NacosException; 这个方法可以在注册服务的时候,传入一个 Instanc 实例,而在 Instance 实例中,可以设置实例的若干属性: public class Instance { /* * Unique ID of this instance. / private String instanceId; /* * Instance ip / private String ip; /* * Instance port / private int port; /* * Instance weight / private double weight = 1.0D; /* * Instance health status / @JSONField(name = "valid") private boolean healthy = true; /* * Cluster information of instance / @JSONField(serialize = false) private Cluster cluster = new Cluster(); /* * Service information of instance / @JSONField(serialize = false) private Service service; /* * User extended attributes / private Map<String, String> metadata = new HashMap<String, String>(); ....} 其中,InstanceId 是由服务端生成返回给客户端,用于唯一标识该实例。IP、端口是实例的基本属性,除此之外,还有 weight 权重,可以设置该实例所分配流量的多少,这应该也比较好理解,权重越大,实例分配的流量就会越大。healthy 字段代表该实例是否健康,这个值也是由服务端返回给客户端的。cluster 和 service 分别表示该实例对应的集群和服务的一些信息,这些信息会在下面做介绍。最后是实例的元数据,这个元数据一个 String 对 String 的 Map。那么可以用如下代码来注册一个自定义实例: Instance instance = new Instance();instance.setIp(InetAddress.getLocalHost().getHostAddress());instance.setPort(8080);instance.setWeight(100);Map<String, String> metadata = new HashMap<String, String>(16);metadata.put("app", "nacos");metadata.put("site", "beijing");instance.setMetadata(metadata);namingService.registerInstance("nacos.test.1", instance); 构建自定义集群 Nacos 引入了集群的概念,在服务这个维度下面,可以对服务下的实例列表再做个划分。这在阿里巴巴内部非常普遍。一个典型的场景是这个服务下的实例,需要配置多种健康检查方式,有一些实例使用 TCP 的健康检查方式,另外一些使用 HTTP 的健康检查方式。另一个场景是,这个服务下挂载的机器分属不同的环境,我们希望能够在某些情况下(包括演练)将某个环境的流量全部切走,这样可以通过配置一个环境属于一个集群,来做到一次性切流。 在客户端构建自定义集群,有一些陷阱需要小心。当前我们只有注册实例的接口,实例内部的 cluster 字段可以配置集群的属性。但是多个实例之间如果配置了不同的集群属性,这时候会发生什么呢?Nacos 只会接受第一次注册该集群所传入的集群属性,也就是说,先注册的实例,获得优先权,将它对应的集群信息注册到 Nacos 服务端。只有 Nacos 服务端已经存在该集群的配置,后续的注册请求里的集群信息,都会被忽略。为了确保你的应用保持预期的行为,请务必让同一个集群下的实例使用相同的集群配置。 下面来看看可以为集群定义哪些配置: public class Cluster { /* * Name of belonging service / private String serviceName; /* * Name of cluster / private String name = ""; /* * Health check config of this cluster / private AbstractHealthChecker healthChecker = new AbstractHealthChecker.Tcp(); /* * Default registered port for instances in this cluster. / private int defaultPort = 80; /* * Default health check port of instances in this cluster. / private int defaultCheckPort = 80; /* * Whether or not use instance port to do health check. / private boolean useIPPort4Check = true; private Map<String, String> metadata = new HashMap<String, String>(); ...} 首先是集群对应的服务名,用来表示该集群所属的服务;然后是集群的名字、健康检查方式、默认的端口、默认的健康检查端口以及是否使用是的端口做健康检查。我们先来说简单的,默认端口表示注册时实例默认的端口,这个在客户端并没有体现,但是当使用 API 注册实例的时候,端口是可以不传入的,此时就会用这个默认端口作为实例的端口。然后是默认的健康检查端口,当健康检查方式中没有配置端口时,就会用这个端口来和实例通信,进行健康检查。下一个属性是是否使用实例端口做健康检查,如果设为 true,则会使用实例注册的端口来和实例进行通信。最后一个属性是集群的元数据,Nacos 支持多个维度的元数据,实例支持,集群支持,下面介绍的服务属性也支持。 健康检查方式,客户端心跳是一种模式,由客户端主动上报健康状态。服务端检测是另外一种模式,Nacos 目前支持三种:TCP、HTTP 和 MYSQL。TCP 方式会从 Nacos 服务端建立一个连接到实例,如果连接建立成功,则表示该实例健康。HTTP 方式则会从 Nacos 服务端想实例发起一个 HTTP 请求,可以配置的属性有访问的相对路径,访问的 HTTP 头部,这个头部使用竖线进行分割,以及预期的请求返回码,默认为 200: private String path = "";private String headers = "";private int expectedResponseCode = 200; MYSQL 健康检查方式,则可以让 Nacos 往实例执行一条 MySQL 命令,可以配置的属性有用户名、密码和执行的命令。执行结果如果不抛异常,则表示实例健康: private String user;private String pwd;private String cmd; 构建自定义服务 同理,服务也可能需要自定义的配置,Nacos 的服务随着实例的注册而存在,并随着所有实例的注销而消亡。目前除了使用 HTTP API 可以修改服务的属性外(这将在未来的篇章中进行介绍),就只能使用注册实例时传入服务属性来进行服务的自定义配置。这里的服务与 Consul 或者 Eureka 不同,Consul 与 Eureka 的服务其实就是指的实例,而每个实例有一个服务名,通过这个服务名来获取相同服务名下的实例列表,服务本身并不是一个数据实体。在真正的生产环境中,我们认为服务本身也是具有数据存储需求的,例如作用于服务下所有实例的配置、权限控制等。虽然有一些配置可以放到实例级别,例如健康检查是否开启。但是当服务的规模成千上万后,想要整体修改这些实例的健康检查开关,就是一个繁重的运维操作。另一些配置,例如下文会提到的健康保护阈值,是一定是一个服务只有一个唯一的值的,多个值将会造成逻辑上的冲突。 /* * Service name / private String name; /* * Protect threshold / private float protectThreshold = 0.0F; /* * Application name of this service / private String app; /* * Service group which is meant to classify services into different sets. / private String group; /* * Health check mode. / private String healthCheckMode; private Map<String, String> metadata = new HashMap<String, String>(); 服务的属性存储在 Service 类中,自上而下,依次是服务的名称、服务的健康保护阈值、服务的应用名、服务的分组、服务的健康检查模式以及服务的元数据。相关概念这里不再做一一陈述,你可以参考 Nacos 官网 概念介绍。这里要提到的是服务的健康保护阈值,在阿里巴巴内部,这个值被广泛的设置和调优。在这里对该属性的初衷做一个简单的介绍。分布式服务场景下的一个问题是在部分实例不健康的情况下,是否能够将流所有流量引向其他健康实例?在一些情况下,这可能造成雪崩效应。即本来健康的实例被多余的流量冲击,也变得不健康,然后导致健康的实例越来越少,最后整个服务崩溃。此时可以使用这个健康保护阈值,当健康实例与所有实例的比例小于这个值的时候,则认为所有实例都是健康的,这样虽然部分流量流向了不健康的实例,但是剩余健康的实例还是能够正常访问的。 服务发现 Nacos 的服务发现,有主动拉取和推送两种模式,这与一般的服务发现架构相同。在拉取方式中,提供了三个方法,一个是查询所有注册的实例,一个是只查询健康且上线的实例,还有一个是获取一个健康且上线的实例。一般情况下,订阅端并不关心不健康的实例或者权重设为 0 的实例,但是也不排除一些场景下,有一些运维或者管理的场景需要拿到所有的实例。目前的版本同时还支持根据服务端设定的负载均衡策略,来查询单个可用的实例。就好像 DNS 解析一样,虽然每次都返回一个后端 IP,但是整体可以保证域名挂载的所有 IP 会按照一定的策略都能够被客户端解析到。 /* * Get all instances of a service * * @param serviceName name of service * @return A list of instance * @throws NacosException /List<Instance> getAllInstances(String serviceName) throws NacosException;/* * Get qualified instances of service * * @param serviceName name of service * @param healthy a flag to indicate returning healthy or unhealthy instances * @return A qualified list of instance * @throws NacosException /List<Instance> selectInstances(String serviceName, boolean healthy) throws NacosException;/* * Select one healthy instance of service using predefined load balance strategy * * @param serviceName name of service * @return qualified instance * @throws NacosException /Instance selectOneHealthyInstance(String serviceName) throws NacosException; 前两个查询方法会返回所有实例的列表,这允许用户通过额外的工作,将实例的权重或者元数据运用到负载均衡中。对于一般的微服务场景,针对每个实例轮询,这样已经足够了。事实上,不管是在 Eureka 还是 Consul 里,其原生客户端都是只负责服务的发现,并不支持负载均衡。这样就需要第三方的 ribbon 或者 fabio 来完成负载均衡工作,此时它们的负载均衡,是完全放在客户端的。 Nacos 也会支持客户端侧的负载均衡,并支持用户扩展的负载均衡策略。不过在阿里巴巴内部,通常只需要由服务端来配置负载均衡策略,所有的调用端不区分业务的使用同一套负载均衡策略。因为实际上,调用端往往并不关心自身访问的服务的流量分配,而只需要一个可用的服务节点就可以了。而服务提供端,则由于其部署规模很大和部署环境的复杂,需要对环境信息敏感的流量分配以及对流量的绝对控制权。这时,往往需要提供端审慎的配置好统一的负载均衡策略,来保证所有订阅端按照这个策略来进行访问。 除了主动查询实例列表,Nacos 还提供订阅模式来感知服务下实例列表的变化,包括服务配置或者实例配置的变化。可以使用下面的接口来进行订阅或者取消订阅: /* * Subscribe service to receive events of instances alteration * * @param serviceName name of service * @param listener event listener * @throws NacosException /void subscribe(String serviceName, EventListener listener) throws NacosException;/* * Unsubscribe event listener of service * * @param serviceName name of service * @param listener event listener * @throws NacosException */void unsubscribe(String serviceName, EventListener listener) throws NacosException; 控制台使用 Nacos 0.3.0 版本上线了控制台,作为生产环境基本的运维工具,服务发现也通过控制台释放了部分的运维能力。虽然控制台承担的是运维为主的工作,但是开发人员也需要通过控制台来查看当前服务的注册状态和健康状态等,服务发现的控制台页面介绍可以参考 https://nacos.io/en-us/blog/discovery-console.html。虽然这篇文章中的一些页面通过社区的反馈而做了细微的调整,但是通过这篇文章应该可以掌握怎么使用服务发现的控制台了。控制台的启动方式也很简单,将 Nacos 安装包下载安装启动(安装教程)之后,直接访问:http://localhost:8848/nacos/index.html 即可打开最新的控制台界面。 小 结 Nacos 目前的版本,集成了服务发现和配置管理的基本能力以及部分高级特性。作为最小生产可用版本,Nacos 未来还会继续开放新特性,结合 SpringCloud、K8S、Dubbo 等生态,为开发者提供极致易用和稳定的服务管理和配置管理能力。在可预期的几个版本内,将会支持元数据的管理及 DNS 的服务发现。争取将使用 Nacos,作为服务发现和配置管理选型的最佳实践。 答案来源网络,供参考,希望对您有帮助

问问小秘 2019-12-02 03:00:16 0 浏览量 回答数 0

问题

修改了php.ini各种重启依旧无效:配置报错 

kun坤 2020-06-04 10:23:30 4 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站