Giter Club home page Giter Club logo

microservice_arch_kubernetes's Introduction

Fenix's BookStore后端:以Kubernetes微服务实现

logo

Travis-CI License Document License About Author

如果你此时并不曾了解过什么是“The Fenix Project”,建议先阅读这部分内容

2017年,笔者曾在文章中描述其为“后微服务时代”的开端,这年是容器生态发展历史中具有里程碑意义的一年。在这一年,长期作为Docker竞争对手的RKT容器一派的领导者CoreOS宣布放弃自己的容器管理系统Fleet,未来将会把所有容器管理的功能移至Kubernetes之上去实现。在这一年,容器管理领域的独角兽Rancher Labs宣布放弃其内置了数年的容器管理系统Cattle,提出了“All-in-Kubernetes”战略,从2.0版本开始把1.x版本能够支持多种容器管理工具的Rancher,“反向升级”为只支持Kubernetes一种容器管理系统。在这一年,Kubernetes的主要竞争者Apache Mesos在9月正式宣布了“Kubernetes on Mesos”集成计划,由竞争关系转为对Kubernetes提供支持,使其能够与Mesos的其他一级框架(如HDFSSparkChronos,等等)进行集群资源动态共享、分配与隔离。在这一年,Kubernetes的最大竞争者Docker Swarm的母公司Docker,终于在10月被迫宣布Docker要同时支持Swarm与Kubernetes两套容器管理系统,事实上承认了Kubernetes的**地位。这场已经持续了三、四年时间,以Docker Swarm、Apache Mesos与Kubernetes为主要竞争者的“容器战争”终于有了明确的结果,Kubernetes登基加冕是容器发展中一个时代的终章,也将是软件架构发展下一个纪元的开端。

需求场景

当引入了基于Spring Cloud的微服务架构后,小书店Fenix's Bookstore初步解决了扩容缩容、独立部署、运维和管理等问题,满足了产品经理不断提出的日益复杂的业务需求。可是,对于团队的开发人员、设计人员、架构人员来说,并没有感觉到工作变得轻松,微服务中的各种新技术名词,如配置中心、服务发现、网关、熔断、负载均衡等等,就够一名新手学习好长一段时间;从产品角度来看,各种Spring Cloud的技术套件,如Config、Eureka、Zuul、Hystrix、Ribbon、Feign等,也占据了产品的大部分编译后的代码容量。之所以微服务架构里,我们选择在应用层面而不是基础设施层面去解决这些分布式问题,完全是因为由硬件构成的基础设施,跟不上由软件构成的应用服务的灵活性的无奈之举。当Kubernetes统一了容器编排管理系统之后,这些纯技术性的底层问题,便开始有了被广泛认可和采纳的基础设施层面的解决方案。为此,Fenix's Bookstore也迎来了它在“后微服务时代”中的下一次架构演进,这次升级的目标主要有如下两点:

  • 目标一:尽可能缩减非业务功能代码的比例。
    在Fenix's Bookstore中,用户服务(Account)、商品服务(Warehouse)、交易服务(Payment)三个工程是真正承载业务逻辑的,认证授权服务(Security)可以认为是同时涉及到了技术与业务,而配置中心(Configuration)、网关(Gateway)和服务注册中心(Registry)则是纯技术性。我们希望尽量消除这些纯技术的工程,以及那些依附在其他业务工程上的纯技术组件。
  • 目标二:尽可能在不影响原有的代码的前提下完成迁移。
    得益于Spring Framework 4中的Conditional Bean等声明式特性的出现,对于近年来新发布的Java技术组件,声明式编程(Declarative Programming)已经逐步取代命令式编程(Imperative Programming)成为主流的选择。在声明式编程的支持下,我们可以从目的而不是过程的角度去描述编码意图,使得代码几乎不会与具体技术实现产生耦合,若要更换一种技术实现,只需要调整配置中的声明便可做到。

从升级结果来看,如果仅以Java代码的角度来衡量,本工程与此前基于Spring Cloud的实现没有丝毫差异,两者的每一行Java代码都是一模一样的;真正的区别在Kubernetes的实现版本中直接删除了配置中心、服务注册中心的工程,在其他工程的pom.xml中也删除了如Eureka、Ribbon、Config等组件的依赖。取而代之的是新增了若干以YAML配置文件为载体的Skaffold和Kubernetes的资源描述,这些资源描述文件,将会动态构建出DNS服务器、服务负载均衡器等一系列虚拟化的基础设施,去代替原有的应用层面的技术组件。升级改造之后的应用架构如下图所示:

运行程序

在已经部署Kubernetes集群的前提下,通过以下几种途径,可以运行程序,浏览最终的效果:

  • 直接在Kubernetes集群环境上运行:
    工程在编译时已通过Kustomize产生出集成式的资源描述文件,可通过该文件直接在Kubernetes集群中运行程序:

    # 资源描述文件
    $ kubectl apply -f https://raw.githubusercontent.com/fenixsoft/microservice_arch_kubernetes/master/bookstore.yml

    命令执行过程一共需要下载几百MB的镜像,尤其是Docker中没有各层基础镜像缓存时,请根据自己的网速保持一定的耐心。未来GraalVM对Spring Cloud的支持更成熟一些后,可以考虑采用GraalVM来改善这一点。当所有的Pod都处于正常工作状态后,在浏览器访问:http://localhost:30080,系统预置了一个用户(user:icyfenix,pw:123456),也可以注册新用户来测试。

  • 通过Skaffold在命令行或IDE中以调试方式运行:
    一般开发基于Kubernetes的微服务应用,是在本地针对单个服务编码、调试完成后,通过CI/CD流水线部署到Kubernetes中进行集成的。如果只是针对集成测试,这并没有什么问题,但同样的做法应用在开发阶段就相当不便了,我们不希望每做一处修改都要经过一次CI/CD流程,这将非常耗时且难以调试。
    Skaffold是Google在2018年开源的一款加速应用在本地或远程Kubernetes集群中构建、推送、部署和调试的自动化命令行工具,对于Java应用来说,它可以帮助我们做到监视代码变动,自动打包出镜像,将镜像打上动态标签并更新部署到Kubernetes集群,为Java程序注入开放JDWP调试的参数,并根据Kubernetes的服务端口自动在本地生成端口转发。以上都是根据skaffold.yml中的配置来进行的,开发时skaffold通过dev指令来执行这些配置,具体的操作过程如下所示:

    # 克隆获取源码
    $ git clone https://github.com/fenixsoft/microservice_arch_kubernetes.git && cd microservice_arch_kubernetes
    
    # 编译打包
    $ ./mvnw package
    
    # 启动Skaffold
    # 此时将会自动打包Docker镜像,并部署到Kubernetes中
    $ skaffold dev

    服务全部启动后,在浏览器访问:http://localhost:30080,系统预置了一个用户(user:icyfenix,pw:123456),也可以注册新用户来测试

    由于面向的是开发环境,基于效率原因,笔者并没有像传统CI工程那样直接使用Maven的Docker镜像来打包Java源码,这决定了构建Dockerfile时,要监视的变动目标将是Jar文件而不是Java源码,Skaffold的执行是由Jar包的编译结果来驱动的,只在进行Maven编译、输出了新的Jar包后才会更新镜像。这样做一方面是考虑到在Maven镜像中打包不便于利用本地的仓库缓存,尤其在国内网络中,速度实在难以忍受;另外一方面,是笔者其实并不希望每保存一次源码时,都自动构建和更新一次镜像,毕竟比起传统的HotSwap或者Spring Devtool Reload来说,更新镜像重启Pod是一个更加重负载的操作。未来CNCF的Buildpack成熟之后,应该可以绕过笨重的Dockerfile,对打包和容器热更新做更加精细化的控制。

    另外,对于有IDE调试需求的同学,推荐采用Google Cloud Code(Cloud Code同时提供了VS Code和IntelliJ Idea的插件)来配合Skaffold使用,毕竟是同一个公司出品的产品,搭配起来能获得几乎与本地开发单体应用一致的编码和调试体验。

技术组件

Fenix's Bookstore采用基于Kubernetes的微服务架构,并采用Spring Cloud Kubernetes做了适配,其中主要的技术组件包括:

  • 环境感知:Spring Cloud Kubernetes本身引入了Fabric8的Kubernetes Client作为容器环境感知,不过引用的版本相当陈旧,如Spring Cloud Kubernetes 1.1.2中采用的是Fabric8 Kubernetes Client 4.4.1,Fabric8提供的兼容性列表中该版本只支持到Kubernetes 1.14,实测在1.16上也能用,但是在1.18上无法识别到最新的Api-Server,因此Maven引入依赖时需要手工处理,排除旧版本,引入新版本(本工程采用的是4.10.1)。
  • 配置中心:采用Kubernetes的ConfigMap来管理,通过Spring Cloud Kubernetes Config自动将ConfigMap的内容注入到Spring配置文件中,并实现动态更新。
  • 服务发现:采用Kubernetes的Service来管理,通过Spring Cloud Kubernetes Discovery自动将HTTP访问中的服务转换为FQDN
  • 负载均衡:采用Kubernetes Service本身的负载均衡能力实现(就是DNS负载均衡),可以不再需要Ribbon这样的客户端负载均衡了。Spring Cloud Kubernetes从1.1.2开始也已经移除了对Ribbon的适配支持,也(暂时)没有对其代替品Spring Cloud LoadBalancer提供适配。
  • 服务网关:网关部分仍然保留了Zuul,未采用Ingress代替。这里有两点考虑,一是Ingress Controller不算是Kubernetes的自带组件,它可以有不同的选择(KONG、Nginx、Haproxy,等等),同时也需要独立安装,作为演示工程,出于环境复杂度最小化考虑未使用Ingress;二是Fenix's Bookstore的前端工程是存放在网关中的,移除了Zuul之后也仍然要维持一个前端工程的存在,不能进一步缩减工程数量,也就削弱了移除Zuul的动力。
  • 服务熔断:仍然采用Hystrix,Kubernetes本身无法做到精细化的服务治理,包括熔断、流控、监视,等等,我们将在基于Istio的服务网格架构中解决这个问题。
  • 认证授权:仍然采用Spring Security OAuth 2,Kubernetes的RBAC授权可以解决服务层面的访问控制问题,但Security是跨越了业务和技术的边界的,认证授权模块本身仍承担着对前端用户的认证、授权职责,这部分是与业务相关的。

协议

  • 本文档代码部分采用Apache 2.0协议进行许可。遵循许可的前提下,你可以自由地对代码进行修改,再发布,可以将代码用作商业用途。但要求你:

    • 署名:在原有代码和衍生代码中,保留原作者署名及代码来源信息。
    • 保留许可证:在原有代码和衍生代码中,保留Apache 2.0协议文件。
  • 本作品文档部分采用知识共享署名 4.0 国际许可协议进行许可。 遵循许可的前提下,你可以自由地共享,包括在任何媒介上以任何形式复制、发行本作品,亦可以自由地演绎、修改、转换或以本作品为基础进行二次创作。但要求你:

    • 署名:应在使用本文档的全部或部分内容时候,注明原作者及来源信息。
    • 非商业性使用:不得用于商业出版或其他任何带有商业性质的行为。如需商业使用,请联系作者。
    • 相同方式共享的条件:在本文档基础上演绎、修改的作品,应当继续以知识共享署名 4.0国际许可协议进行许可。

microservice_arch_kubernetes's People

Contributors

fenixsoft avatar mzlogin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

microservice_arch_kubernetes's Issues

容器无法启动

报错信息:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGILL (0x4) at pc=0x00007f6a2fc8f9bc, pid=1, tid=7
#
# JRE version: OpenJDK Runtime Environment (12.0+29) (build 12-ea+29)
# Java VM: OpenJDK 64-Bit Server VM (12-ea+29, mixed mode, sharing, tiered, compressed oops, serial gc, linux-amd64)
# Problematic frame:
# v  ~StubRoutines::updateBytesCRC32
#
# Core dump will be written. Default location: //core.1 (max size 1024 kB). To ensure a full core dump, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# //hs_err_pid1.log
Could not load hsdis-amd64.so; library not loadable; PrintAssembly is disabled
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#

image

Build Failed. No push access to specified image repository. Trying running with `--default-repo` flag.

Build Failed. No push access to specified image repository. Trying running with --default-repo flag.

请问下,按照 readme.md 克隆到本地,按照构建命令构建,skaffold dev 报错如上,需要做什么配置吗?
以下是按照构建部分输出:

./mvnw package

[INFO]
[INFO] bookstore-microservices-kubernetes ................. SUCCESS [  0.952 s]
[INFO] bookstore-microservices-platform-gateway ........... SUCCESS [  1.391 s]
[INFO] bookstore-microservices-library-infrastructure ..... SUCCESS [  0.460 s]
[INFO] bookstore-microservices-library-testing ............ SUCCESS [  0.211 s]
[INFO] bookstore-microservices-domain-security ............ SUCCESS [ 15.275 s]
[INFO] bookstore-microservices-domain-payment ............. SUCCESS [ 14.341 s]
[INFO] bookstore-microservices-domain-account ............. SUCCESS [ 14.164 s]
[INFO] bookstore-microservices-domain-warehouse ........... SUCCESS [ 14.414 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:01 min
[INFO] Finished at: 2021-06-01T15:34:02+08:00
[INFO] ------------------------------------------------------------------------

skaffold dev

Listing files to watch...
 - icyfenix/bookstore-kubernetes-domain-warehouse
 - icyfenix/bookstore-kubernetes-domain-security
 - icyfenix/bookstore-kubernetes-domain-account
 - icyfenix/bookstore-kubernetes-domain-payment
 - icyfenix/bookstore-kubernetes-platform-gateway
……
……
……
Checking cache...
 - icyfenix/bookstore-kubernetes-domain-warehouse: Not found. Building
 - icyfenix/bookstore-kubernetes-domain-security: Not found. Building
 - icyfenix/bookstore-kubernetes-domain-account: Not found. Building
 - icyfenix/bookstore-kubernetes-domain-payment: Not found. Building
 - icyfenix/bookstore-kubernetes-platform-gateway: Not found. Building
Starting build...
……
……
……
Successfully built 85cb40a7b4bd
Successfully tagged icyfenix/bookstore-kubernetes-domain-warehouse:latest
The push refers to repository [docker.io/icyfenix/bookstore-kubernetes-domain-warehouse]
fe767f9494ae: Preparing
e10fdc20c652: Preparing
503e53e365f3: Preparing
Building [icyfenix/bookstore-kubernetes-domain-security]...
Building [icyfenix/bookstore-kubernetes-domain-account]...
Building [icyfenix/bookstore-kubernetes-domain-payment]...
Building [icyfenix/bookstore-kubernetes-platform-gateway]...
Build Failed. No push access to specified image repository. Trying running with `--default-repo` flag.

bookstore-microservices-platform-gateway服务启动不了

周老师好,通过下面的命令启动整个集群:

kubectl apply -f bookstore.yml

其他都显示正常启动,就是bookstore-microservices-platform-gateway服务启动不了,是不是这个镜像有问题?因为我看到这个镜像的下载次数比其他镜像的多一倍。

基于minikube环境:

[root@k8s microservice_arch_kubernetes]# minikube version
minikube version: v1.7.2
commit: 50d543b5fcb0e1c0d7c27b1398a9a9790df09dfb

pod的日志如下:

[root@k8s microservice_arch_kubernetes]# kubectl logs bookstore-microservices-platform-gateway-84b7c776dd-k2sd4  -n bookstore-microservices
Picked up JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=n,quiet=y
    ______           _         ____              __  _____ __
   / ____/__  ____  (_)  __   / __ )____  ____  / /_/ ___// /_____  ________
  / /_  / _ \/ __ \/ / |/_/  / __  / __ \/ __ \/ __/\__ \/ __/ __ \/ ___/ _ \
 / __/ /  __/ / / / />  <   / /_/ / /_/ / /_/ / /_ ___/ / /_/ /_/ / /  /  __/
/_/    \___/_/ /_/_/_/|_|  /_____/\____/\____/\__//____/\__/\____/_/   \___/
                                                               API Gateway

2021-07-22 14:39:15.572  INFO 1 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8888
2021-07-22 14:39:15.813  INFO 1 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Connect Timeout Exception on Url - http://localhost:8888. Will be trying the next url if available
2021-07-22 14:39:15.827 ERROR 1 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateException: Could not locate PropertySource and the fail fast property is set, failing
	at org.springframework.cloud.config.client.ConfigServicePropertySourceLocator.locate(ConfigServicePropertySourceLocator.java:148) ~[spring-cloud-config-client-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
	at org.springframework.cloud.bootstrap.config.PropertySourceLocator.locateCollection(PropertySourceLocator.java:52) ~[spring-cloud-context-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
	at org.springframework.cloud.config.client.ConfigServicePropertySourceLocator.locateCollection(ConfigServicePropertySourceLocator.java:163) ~[spring-cloud-config-client-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
	at org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration.initialize(PropertySourceBootstrapConfiguration.java:97) ~[spring-cloud-context-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
	at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:626) ~[spring-boot-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
	at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:370) ~[spring-boot-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) ~[spring-boot-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
	at com.github.fenixsoft.bookstore.gateway.GatewayApplication.main(GatewayApplication.java:19) ~[classes!/:1.0.0-SNAPSHOT]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) ~[gateway.jar:1.0.0-SNAPSHOT]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) ~[gateway.jar:1.0.0-SNAPSHOT]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) ~[gateway.jar:1.0.0-SNAPSHOT]
	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) ~[gateway.jar:1.0.0-SNAPSHOT]
Caused by: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:8888/gateway/default": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)
	at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:748) ~[spring-web-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
	at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674) ~[spring-web-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
	at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:583) ~[spring-web-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
	at org.springframework.cloud.config.client.ConfigServicePropertySourceLocator.getRemoteEnvironment(ConfigServicePropertySourceLocator.java:264) ~[spring-cloud-config-client-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
	at org.springframework.cloud.config.client.ConfigServicePropertySourceLocator.locate(ConfigServicePropertySourceLocator.java:107) ~[spring-cloud-config-client-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
	... 17 common frames omitted
Caused by: java.net.ConnectException: Connection refused (Connection refused)
	at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na]
	at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[na:na]
	at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) ~[na:na]
	at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) ~[na:na]
	at java.base/java.net.Socket.connect(Socket.java:591) ~[na:na]
	at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:177) ~[na:na]
	at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:474) ~[na:na]
	at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:569) ~[na:na]
	at java.base/sun.net.www.http.HttpClient.<init>(HttpClient.java:242) ~[na:na]
	at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:341) ~[na:na]
	at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:362) ~[na:na]
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1242) ~[na:na]
	at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1181) ~[na:na]
	at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1075) ~[na:na]
	at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:1009) ~[na:na]
	at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:76) ~[spring-web-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
	at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
	at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) ~[spring-web-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
	at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:739) ~[spring-web-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
	... 21 common frames omitted

http 500

kubectl get pods -o wide -A
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
bookstore-microservices bookstore-microservices-domain-account-586bfcf795-xwns8 1/1 Running 0 25m 172.16.104.18 node2
bookstore-microservices bookstore-microservices-domain-payment-586b9b464-rpkpm 1/1 Running 0 25m 172.16.166.141 node1
bookstore-microservices bookstore-microservices-domain-security-557d78bb5b-mqk8f 1/1 Running 0 25m 172.16.104.20 node2
bookstore-microservices bookstore-microservices-domain-warehouse-6c6d6886f9-z8bms 1/1 Running 0 25m 172.16.166.137 node1
bookstore-microservices bookstore-microservices-platform-gateway-665dddcd8c-mpds8 1/1 Running 2 (18m ago) 25m 172.16.104.24 node2

kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bookstore-microservices account ClusterIP 10.104.226.115 80/TCP 25m
bookstore-microservices gateway NodePort 10.98.218.93 8080:30080/TCP 25m
bookstore-microservices payment ClusterIP 10.105.222.242 80/TCP 25m
bookstore-microservices security ClusterIP 10.109.133.33 80/TCP 25m
bookstore-microservices warehouse ClusterIP 10.105.147.22 80/TCP 25m

部署成功了,但是实际登录192.168.159.130:30080时,报http500错误
接收到未处理的异常:
HTTP Code:500, 信息:[Internal Server Error] Connect to warehouse:80 [warehouse/10.105.147.22] failed: Connection refused (Connection refused)

Application using openjdk:12-alpine failed to start on CentOS EL8

Run: kubectl apply -f https://raw.githubusercontent.com/fenixsoft/microservice_arch_kubernetes/master/bookstore.yml

Got in pods log:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGILL (0x4) at pc=0x00007fe41a2b69bc, pid=1, tid=7
#
# JRE version: OpenJDK Runtime Environment (12.0+29) (build 12-ea+29)
# Java VM: OpenJDK 64-Bit Server VM (12-ea+29, mixed mode, sharing, tiered, compressed oops, serial gc, linux-amd64)
# Problematic frame:
# v  ~StubRoutines::updateBytesCRC32
#
# Core dump will be written. Default location: //core.1 (max size 1024 kB). To ensure a full core dump, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# //hs_err_pid1.log
Could not load hsdis-amd64.so; library not loadable; PrintAssembly is disabled
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#

Maybe it's a JDK bug, and I can avoid this by adding -XX:UseSSE=2 to JAVA_TOOL_OPTIONS temporarily

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.