铁爷


  • Home

  • Archives

springboot项目maven冲突问题解决

Posted on 2019-07-19 | In spring

springboot项目maven冲突问题解决

问题

项目启动后,报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/org/slf4j/slf4j-log4j12/1.7.26/slf4j-log4j12-1.7.26.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Exception in thread "main" java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Log4jLoggerFactory loaded from file:/C:/Users/Administrator/.m2/repository/org/slf4j/slf4j-log4j12/1.7.26/slf4j-log4j12-1.7.26.jar). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml: org.slf4j.impl.Log4jLoggerFactory
at org.springframework.util.Assert.instanceCheckFailed(Assert.java:655)
at org.springframework.util.Assert.isInstanceOf(Assert.java:555)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:279)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:103)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:212)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:193)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:69)
at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:47)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:301)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1213)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1202)

原因分析、解决思路

查找依赖

1
mvn dependency:tree

列出依赖如下:

1
2
3
4
5
6
7
8
9
10
11
.....

[INFO] +- org.apache.zookeeper:zookeeper:jar:3.5.5:compile
[INFO] | +- org.apache.zookeeper:zookeeper-jute:jar:3.5.5:compile
[INFO] | +- org.apache.yetus:audience-annotations:jar:0.5.0:compile
[INFO] | +- io.netty:netty-all:jar:4.1.36.Final:compile
[INFO] | +- org.slf4j:slf4j-api:jar:1.7.26:compile
[INFO] | +- org.slf4j:slf4j-log4j12:jar:1.7.26:compile
[INFO] | \- log4j:log4j:jar:1.2.17:compile

......

结合错误提示:

Either remove Logback or the competing implementation (class org.slf4j.impl.Log4jLoggerFactory

结合代码修改记录,原因由于加入了zookeeper的包,导致log出现冲突,因此,可以通过exclusion来排除该包解决。

解决方案

在pom.xml中,排除zookeeper的org.slf4j:slf4j-log4j12依赖:

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.5</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>

各种证书生成及转换

Posted on 2019-06-27 | In SSL

生成证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/bin/bash

###################################################################################################################
# 生成ca pair
keytool -genkeypair -alias ca -keyalg RSA -keysize 4096 -validity 3650 -keystore ca.jks

# 查看证书
keytool -list -v -keystore ca.jks

# 导出公钥证书
keytool -export -alias ca -keystore ca.jks -rfc -file ca.cer

# 将证书导入到truststore
keytool -import -v -trustcacerts -alias ca -file ca.cer -keystore truststore.jks

# 格式转换为p12
keytool -importkeystore -srckeystore ca.jks -destkeystore ca.jks -deststoretype pkcs12

# 删除旧文件
rm ca.jks.old


###################################################################################################################
# server 证书
keytool -genkeypair -alias server -keyalg RSA -keysize 4096 -validity 3650 -keystore server.jks

# 从证书中导出签名请求
keytool -certreq -file server.csr -alias server -keystore server.jks

# 使用ca为server.csr签发证书
keytool -gencert -infile server.csr -outfile server.cer -alias ca -keystore ca.jks

# 导入ca证书
keytool -importcert -alias ca -file ca.cer -keystore server.jks

# 导入签发证书
keytool -importcert -alias server -file server.cer -keystore server.jks

# 格式转换为p12
keytool -importkeystore -srckeystore server.jks -destkeystore server.jks -deststoretype pkcs12

# delete unused files
rm server.jks.old server.csr



####################################################################################################################
# client 证书
keytool -genkeypair -alias client -keyalg RSA -keysize 4096 -validity 3650 -keystore client.jks

# 格式转换为p12
keytool -importkeystore -srckeystore client.jks -destkeystore client.jks -deststoretype pkcs12

# 从证书中导出签名请求
keytool -certreq -file client.csr -alias client -keystore client.jks

# 使用ca为server.csr签发证书
keytool -gencert -infile client.csr -outfile client.cer -alias ca -keystore ca.jks

# 导入ca证书
keytool -importcert -alias ca -file ca.cer -keystore client.jks

# 导入签发证书
keytool -importcert -alias client -file client.cer -keystore client.jks

# delete unused files
rm client.jks.old client.csr

证书格式转换(JKS,p12,pem,crt,key)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

###################################################################################################################
# jks to p12
keytool -importkeystore -srckeystore server.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore server.p12

###################################################################################################################
# p12 to jks
keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore server.jks

###################################################################################################################
# p12 to cert & key
# -clcerts Only output client certificates
# -cacerts Only output CA certificates
# -nokeys Don't output private keys
# -nodes Don't encrypt private keys
openssl pkcs12 -in server.p12 -out server.crt -nokeys -clcerts
openssl pkcs12 -in server.p12 -out server.key -nodes


###################################################################################################################
# p12 to pem
openssl pkcs12 -in server.p12 -out server.pem -nodes

spring boot双向SSL验证问题及解决

Posted on 2019-06-27 | In spring , SSL

最近在做服务端、客户端SSL双向验证的问题,启动后,发现报错,如下:

trustAnchors parameter must be non-empty

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

org.apache.catalina.LifecycleException: Protocol handler start failed
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1008) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:227) [tomcat-embed-core-9.0.21.jar:9.0.21]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:263) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:195) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:296) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:162) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552) [spring-context-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:742) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:389) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:311) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1213) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1202) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at com.lambda.verify.VerifyApplication.main(VerifyApplication.java:10) [classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.1.6.RELEASE.jar:2.1.6.RELEASE]
Caused by: java.lang.IllegalArgumentException: the trustAnchors parameter must be non-empty
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:99) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:71) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:218) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1124) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1210) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:585) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1005) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
... 19 common frames omitted
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200) ~[na:1.8.0_201]
at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:157) ~[na:1.8.0_201]
at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:130) ~[na:1.8.0_201]
at org.apache.tomcat.util.net.SSLUtilBase.getParameters(SSLUtilBase.java:491) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
at org.apache.tomcat.util.net.SSLUtilBase.getTrustManagers(SSLUtilBase.java:422) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:247) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:97) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
... 25 common frames omitted

原因:

因为配置的trust-store证书中没有 trustedCertEntry,因此,出现此错误。

在导入root.cer之前,查看server.jks:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
keytool -list -v -keystore server.jks
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN

您的密钥库包含 1 个条目

别名: server
创建日期: 2019-6-27
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=guotie, OU=dev, O=lambda, L=NJ, ST=JS, C=CN
发布者: CN=guotie, OU=dev, O=lambda, L=NJ, ST=JS, C=CN
序列号: 6fe81fc6
有效期为 Thu Jun 27 10:30:40 CST 2019 至 Wed Sep 25 10:30:40 CST 2019
证书指纹:
MD5: 25:93:E9:E6:F6:78:85:95:D2:99:8F:61:2D:F4:D5:4E
SHA1: F0:6C:5A:64:3C:7E:E2:78:A9:8C:53:20:56:31:42:09:63:22:38:65
SHA256: BC:87:37:F3:B2:87:1B:07:CD:28:9C:9A:99:73:21:3D:38:0C:E5:29:CE:4B:BD:27:0B:97:DC:9E:DA:94:CB:34
签名算法名称: SHA256withDSA
主体公共密钥算法: 2048 位 DSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E4 81 90 A1 9E 1F 81 67 DC 17 A9 71 D8 37 32 3F .......g...q.72?
0010: 7C B3 7B 4D ...M
]
]



*******************************************
*******************************************



Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore server.jks -destkeystore server.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

导入root.cer到server.jks:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
keytool -importcert -alias root -file root.cer -keystore server.jks
输入密钥库口令:
所有者: CN=guotie, OU=lambda, O=lambda, L=NanJing, ST=Jiangsu, C=CN
发布者: CN=guotie, OU=lambda, O=lambda, L=NanJing, ST=Jiangsu, C=CN
序列号: 10f60cab
有效期为 Thu Jun 27 10:29:30 CST 2019 至 Wed Sep 25 10:29:30 CST 2019
证书指纹:
MD5: 42:B7:10:5C:93:28:4D:41:4D:64:75:AC:55:A2:18:76
SHA1: FA:6F:D5:7C:B3:46:F8:92:AD:BA:55:D4:2D:7B:8D:22:BA:AC:72:D8
SHA256: 27:C2:59:FD:A8:3B:EB:DB:60:7C:9C:68:08:2D:AD:F3:1D:8B:ED:23:DC:3B:C1:62:EF:4A:21:B6:DA:95:4B:C8
签名算法名称: SHA256withDSA
主体公共密钥算法: 2048 位 DSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E6 66 2A 75 2A 5A DC AF F2 37 E7 DD AF 69 C7 3B .f*u*Z...7...i.;
0010: B1 F4 60 BA ..`.
]
]

是否信任此证书? [否]: y
证书已添加到密钥库中

导入root.cer后,查看server.jks:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
keytool -list -v -keystore server.jks
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN

您的密钥库包含 2 个条目

别名: root
创建日期: 2019-6-27
条目类型: trustedCertEntry

所有者: CN=guotie, OU=lambda, O=lambda, L=NanJing, ST=Jiangsu, C=CN
发布者: CN=guotie, OU=lambda, O=lambda, L=NanJing, ST=Jiangsu, C=CN
序列号: 10f60cab
有效期为 Thu Jun 27 10:29:30 CST 2019 至 Wed Sep 25 10:29:30 CST 2019
证书指纹:
MD5: 42:B7:10:5C:93:28:4D:41:4D:64:75:AC:55:A2:18:76
SHA1: FA:6F:D5:7C:B3:46:F8:92:AD:BA:55:D4:2D:7B:8D:22:BA:AC:72:D8
SHA256: 27:C2:59:FD:A8:3B:EB:DB:60:7C:9C:68:08:2D:AD:F3:1D:8B:ED:23:DC:3B:C1:62:EF:4A:21:B6:DA:95:4B:C8
签名算法名称: SHA256withDSA
主体公共密钥算法: 2048 位 DSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E6 66 2A 75 2A 5A DC AF F2 37 E7 DD AF 69 C7 3B .f*u*Z...7...i.;
0010: B1 F4 60 BA ..`.
]
]



*******************************************
*******************************************


别名: server
创建日期: 2019-6-27
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=guotie, OU=dev, O=lambda, L=NJ, ST=JS, C=CN
发布者: CN=guotie, OU=dev, O=lambda, L=NJ, ST=JS, C=CN
序列号: 6fe81fc6
有效期为 Thu Jun 27 10:30:40 CST 2019 至 Wed Sep 25 10:30:40 CST 2019
证书指纹:
MD5: 25:93:E9:E6:F6:78:85:95:D2:99:8F:61:2D:F4:D5:4E
SHA1: F0:6C:5A:64:3C:7E:E2:78:A9:8C:53:20:56:31:42:09:63:22:38:65
SHA256: BC:87:37:F3:B2:87:1B:07:CD:28:9C:9A:99:73:21:3D:38:0C:E5:29:CE:4B:BD:27:0B:97:DC:9E:DA:94:CB:34
签名算法名称: SHA256withDSA
主体公共密钥算法: 2048 位 DSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E4 81 90 A1 9E 1F 81 67 DC 17 A9 71 D8 37 32 3F .......g...q.72?
0010: 7C B3 7B 4D ...M
]
]



*******************************************
*******************************************

生成符合规范的CA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
###################################################################################################################
# 生成ca pair
keytool -genkeypair -alias ca -keyalg RSA -keysize 4096 -validity 3650 -keystore ca.jks

# 查看证书
keytool -list -v -keystore ca.jks

# 导出公钥证书
keytool -export -alias ca -keystore ca.jks -rfc -file ca.cer

# 将证书导入到truststore
keytool -import -v -trustcacerts -alias ca -file ca.cer -keystore truststore.jks

# 格式转换为p12
keytool -importkeystore -srckeystore ca.jks -destkeystore ca.jks -deststoretype pkcs12
keytool -importkeystore -srckeystore truststore.jks -destkeystore truststore.jks -deststoretype pkcs12

# 删除旧文件
rm ca.jks.old truststore.jks.old

上面生成的truststore.jks就是spring boot中配置的trust证书部分:

1
2
3
4
5
server.ssl.trust-store=classpath:truststore.jks
server.ssl.trust-store-password=xxxxx
server.ssl.client-auth=need
server.ssl.trust-store-type=JKS
server.ssl.trust-store-provider=SUN

参考资料:

https://www.ibm.com/developerworks/cn/java/j-lo-socketkeytool/index.html

https://yushan.iteye.com/blog/434955

生成tomcat的CA证书:

https://my.oschina.net/u/3757195/blog/3031159

kubectl:The connection to the server localhost:8080 was refused - did you specify the right host or port?

Posted on 2019-06-26

安装完kubeadmin 之后,执行kubectl,出现以下错误:

1
The connection to the server localhost:8080 was refused - did you specify the right host or port?

原因是,没有设置环境变量 KUBECONFIG, 对于这一点,包括官方文档上都写的不清楚。

没有这个环境变量来指定kubectl去连接API-Server,这时,kubectl使用默认的地址,就是localhost:8080来连接API server,导致出现连接被拒绝。

解决方案:

root用户

root用户可以直接设置KUBECONFIG为 /etc/kubernetes/admin.conf,命令如下:

1
export KUBECONFIG=/etc/kubernetes/admin.conf

或者可以在.profile中设置,以防再次登录失效。

非root用户

首先,copy系统的配置文件:

1
2
3
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=$HOME/.kube/config

其次,设置环境变量KUBECONFIG

修改 $HOME/.profile,增加:

1
export KUBECONFIG=$HOME/.kube/config

执行 kubectl get pod,就ok了

使用aliyun的源安装kubeadmin

Posted on 2019-06-25 | In kubernetes

由于google的镜像被墙,因此,使用aliyun的镜像来装kubernetes相关的软件。

添加aliyun的source:

1
2
3
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF

验证aliyun的镜像

由于aliyun的镜像没有设置GPG验证,如果这时执行apt update,会出现以下错误:

1
2
3
4
W: GPG error: https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB
E: The repository 'https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

有两种方法解决此问题:

  1. apt-key adv
1
2
3
4
5
6
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <PUBKEY>
Executing: /tmp/apt-key-gpghome.h7LfwDq56p/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys <PUBKEY>

gpg: key <PUBKEY>: public key "Google Cloud Packages Automatic Signing Key <gc-team@google.com>" imported
gpg: Total number processed: 1
gpg: imported: 1

将上面的换成你的pubkey,这里是6A030B21BA07F4FB

  1. apt-key add
1
2
sudo gpg --keyserver pgpkeys.mit.edu --recv-key  <PUBKEY>
sudo gpg -a --export <PUBKEY> | sudo apt-key add -

安装

1
2
3
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

kubeadm init

需要携带 --image-repository 选项

1
kubeadm init --image-repository registry.aliyuncs.com/google_containers

最终运行安装脚本

1
2
3
4
5
6
7
8
9
10
11
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6A030B21BA07F4FB

apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

kubeadm init --image-repository registry.aliyuncs.com/google_containers

spring cloud是未来吗?

Posted on 2019-06-14

spring cloud是未来吗?

spring cloud很火,各种组件层出不穷,但是,spring cloud能代表未来的发展方向吗?

很遗憾,我觉得不能。

spring cloud有一个致命缺点,就是复杂,太复杂。大部分开发者看到spring cloud的组件图就已经懵了。

其中任何一个组件都要学习使用很长时间才能掌握,更何况整个spring cloud中有几十个、上百个组件,重复、互相可替代的组件、接口又有很多,让使用者面临着学习门槛陡峭、使用复杂,选择困难,排错艰难等多重考研,因此,我认为,spring cloud是一个美好的幻觉。

spring cloud给团队一个印象,就是我把这些组件全搞定了,我的服务就完美无缺了。然而实际上,小团队难以掌握这么复杂的系统;中型团队,大型团队也需要投入大部分精力来学习,使用整套系统,同时,还面临巨大的运维成本。

那么,未来的方向是什么呢?

我认为是serverless。

在serverless系统架构下,所有的负载均衡,容错,断流,配置,服务发现等等,都是由框架来完成,应用开发者只需要关注应用逻辑,哇塞,听起来就很诱人。

使用npm安装同一个包的多个版本

Posted on 2019-05-06 | In javascript

安装

有时候,我们需要安装同一个包的多个版本,这时,安装的方式如下:

1
2
yarn add pkg@version
yarn add pkg-alias@npm:pkg[@version]

例如,如果我要同时安装eosjs的16.08版本和最新版本(20.0.0),命令如下:

1
2
yarn add eosjs@16.0.8
yarn add eosjs20@npm:eosjs // 由于最新版本就是20.0.0,这里不需要指定版本号

安装后,在node_modules目录下,有这么两个目录:

eosjs,这个目录下是eosjs 16.0.8版本;

eosjs20,这个目录下是eosjs 20.0.0版本

引用

引用方式如下:

1
2
import Eos from 'eosjs';  // 引用eosjs 16.0.8版本
import {Api, Rpc} from 'eosjs20'; // 引用eosjs 20.0.0版本,这里的包名就是安装时的别名

参考资料

https://yarnpkg.com/lang/en/docs/cli/add/

yarn add @npm:
This will install a package under a custom alias. Aliasing, allows multiple versions of the same dependency to be installed, each referenced via the alias-package name given. For example, yarn add my-foo@npm:foo will install the package foo (at the latest version) in your dependencies under the specified alias my-foo. Also, yarn add my-foo@npm:foo@1.0.1 allows a specific version of foo to be installed.

scatter使用eosjs 20以上版本

Posted on 2019-05-05 | In eos , scatter

通常eos的dapp开发都是使用scatterjs来连接用户或者钱包,scatter的官方文档中的示例基本上都是使用eos 16版本的,eos20版本由于重构的关系,与eos 16版本完全不同,因此,这里给出eos 20的使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import ScatterJS from 'scatterjs-core';
import ScatterEOS from 'scatterjs-plugin-eosjs2';
import {Api, JsonRpc} from 'eosjs'; // eos20


// Don't forget to tell ScatterJS which plugins you are using.
ScatterJS.plugins( new ScatterEOS() );

const network = {
blockchain:'eos',
protocol:'https',
host:'nodes.get-scatter.com',
port:443,
// protocol: 'http',
// host: '178.62.36.41',
// port: 8888,
chainId:'aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906'
}

ScatterJS.scatter.connect("dappdemo").then(connected => {
// User does not have Scatter Desktop, Mobile or Classic installed.
if(!connected) return false;

console.log('connected!');
const scatter = ScatterJS.scatter;
let eosOptions = {};
eosOptions.rpc = new JsonRpc(jungle.protocol + '://' + jungle.host + ':' + jungle.port)
eosOptions.beta3 = true;
var eos = scatter.eos(jungle, Api, eosOptions);
eos.transact({
actions: [{
account: 'eosio.token',
name: 'transfer',
authorization: [{
actor: 'tianji111222',
permission: 'active',
}],
data: {
from: 'tianji111222',
to: 'tianji111333',
quantity: '1.0000 EOS',
memo: 'eos20',
},
}]}, {
blocksBehind: 3,
expireSeconds: 30,
}).then(function(data) {
console.log('transfer return data:', data);
}).catch(function(err) {
console.log('err:', err)
// console.log(data);
});

需要特别注意的是:

  1. 在创建eos实例时,eosOptions的rpc必须先初始化;
  2. eos20-beta3之后的版本(目前),eosOptions的rpc必须设置为true;

eos调用eosjs transfer错误及解决

Posted on 2019-04-25 | In blockchain , eos

使用eosjs 16版本转账示例:

使用scatter版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const jungle = {
blockchain:'eos',
// protocol:'https',
// host:'nodes.get-scatter.com',
// port:443,
protocol: 'https',
host: 'jungle2.cryptolions.io',
port: 443,
chainId:'e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473'
}
scatter.suggestNetwork(jungle);
var eos = scatter.eos(jungle, Eos, eosOptions);
console.log('eos:', eos);

const transactionOptions = { authorization:[`tianji111222@active`] };
eos.transfer({from: 'tianji111222', to: 'tianji111333', quantity: '1.0000 SYS', memo: ''}, transactionOptions).then(function(data) {
console.log(data);
}).catch(function(err) {
console.log('err:', err)
// console.log(data);
});

不使用scatter版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var eos = new Eos({
chainId: jungle.chainId, // 32 byte (64 char) hex string
keyProvider: ['xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'], // WIF string or array of keys..
httpEndpoint: 'https://jungle2.cryptolions.io',
expireInSeconds: 60,
broadcast: true,
verbose: false, // API activity
sign: true
});

eos.transfer({from: 'tianji111222', to: 'tianji111333', quantity: '1.0000 SYS', memo: ''}, function(err, data) {
console.log('err:', err);
console.log('data:', data);
});

出现同一个错误:

1
err: {"code":500,"message":"Internal Service Error","error":{"code":3050003,"name":"eosio_assert_message_exception","what":"eosio_assert_message assertion failure","details":[{"message":"assertion failure with message: unable to find key","file":"wasm_interface.cpp","line_number":924,"method":"eosio_assert"},{"message":"pending console output: ","file":"apply_context.cpp","line_number":72,"method":"exec_one"}]}}

原因:

核心原因在于转账的参数quantity写错了,不知道是以前的教程的版本问题还是什么原因,以前很多文档上都是这样的:

1
quantity: '1.0000 SYS'

现在,应该写成:

1
quantity: '1.0000 EOS'

jebrains全家桶激活破解

Posted on 2019-03-27

jebrains全家桶激活破解:

https://zhile.io/2018/08/17/jetbrains-license-server-crack.html

https://gitee.com/pengzhile/jetbrains-agent

一定通过IDE菜单编辑javaagent参数,别瞎TM在bin目录下改!!!

一定通过IDE菜单编辑javaagent参数,别瞎TM在bin目录下改!!!

一定通过IDE菜单编辑javaagent参数,别瞎TM在bin目录下改!!!

一定通过IDE菜单编辑javaagent参数,别瞎TM在bin目录下改!!!

一定通过IDE菜单编辑javaagent参数,别瞎TM在bin目录下改!!!

123

guotie

25 posts
16 categories
39 tags
© 2019 guotie
Powered by Hexo
|
Theme — NexT.Muse v5.1.4