内容简介:在听起来很简单,所以让我们测试吧!
在 Geecon 2018年, Mauricio Salatino谈到了 Spring Cloud Kubernetes项目 。这个项目有很多好主意。令人印象最深刻的是Spring Cloud K8如何进行 服务发现 。它的工作原理如下:
- 在K8s集群中,没有必要拥有 Eureka 。K8s中的ETCD拥有所有必要的信息。
- 您的应用程序将通过指定的 K8s服务 名称联系K8s API服务器以获取端点信息。
- 然后可以通过 Feign 调用返回的服务。
- 要让 DiscoveryClient 正常运行,您需要做的 就是将Kubernetes服务名称与spring.application.name属性对齐。
听起来很简单,所以让我们测试吧!
服务发现,相同的命名空间不同的pod
让我们看看那一个Spring Cloud Application:
<b>package</b> com.example.service2.mvc; <b>import</b> org.springframework.web.bind.annotation.GetMapping; <b>import</b> org.springframework.web.bind.annotation.RestController; @RestController <b>public</b> <b>class</b> Controller { @GetMapping(path = <font>"/service2"</font><font>) <b>public</b> String respondPoint() { <b>return</b> </font><font>"Hello I'm service2"</font><font>; } } </font>
配置中:spring.application.name.
spring.application.name=service2-chart server.port=8081
现在让我们构建并将应用程序安装到Kubernetes集群中。 为了使它变得美观和流畅,准备了 helm chart .
- $ eval $(minikube docker-env)
- $ mvn clean install
- $ helm install -n service2-chart service2-chart-0.1.0.tgz
helm chart应该安装一切,但让我们检查一下服务:
$ kubectl -n <b>default</b> get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 58d service2-chart NodePort 10.100.48.206 <none> 8081:30467/TCP 18s
好的,我们将Kubernetes服务名称与spring.application.name对齐。
准备另外一个Spring Boot调用service2-chart app/K8s service.
首先,使用Feign客户端,请注意我们只需要知道K8s服务名称,就是这样:
<b>package</b> com.example.service1.mvc; <b>import</b> org.springframework.cloud.openfeign.FeignClient; <b>import</b> org.springframework.web.bind.annotation.GetMapping; @FeignClient(name = <font>"service2-chart"</font><font>) <b>public</b> <b>interface</b> Service2Client { @GetMapping(</font><font>"/service2"</font><font>) String invokeService2(); } </font>
现在调用这个 service2-chart K8s 远程服务:
<b>package</b> com.example.service1.mvc; <b>import</b> org.springframework.beans.factory.annotation.Autowired; <b>import</b> org.springframework.web.bind.annotation.GetMapping; <b>import</b> org.springframework.web.bind.annotation.RestController; @RestController <b>public</b> <b>class</b> Controller { @Autowired <b>private</b> Service2Client service2Client; @GetMapping(path = <font>"/service1"</font><font>) <b>public</b> String respondPoint() { <b>final</b> String service2Output = service2Client.invokeService2(); <b>return</b> </font><font>"Hello I'm Service1 ->"</font><font>+service2Output; } } </font>
一切准备就绪,让我们测试一下:
- $ eval $(minikube docker-env)
- $ mvn clean install
- $ helm install -n service1-chart service1-chart-0.1.0.tgz
Helm应该再次安装所有内容,这是所需的输出:
$ kubectl -n <b>default</b> get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 58d service1-chart NodePort 10.101.7.4 <none> 8082:32391/TCP 3m service2-chart NodePort 10.100.48.206 <none> 8081:30467/TCP 17h
Helm charts 已经安装:
$ helm list NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE service1-chart 1 Sun Dec 23 18:03:30 2018 DEPLOYED service1-chart-0.1.0 1.0 <b>default</b> service2-chart 1 Sun Dec 23 01:05:17 2018 DEPLOYED service2-chart-0.1.0 1.0 <b>default</b>
现在调用/service1 端点,这个端点会调用service2-chart K8s服务:
$ minikube service service1-chart --url http:<font><i>//192.168.99.100:32391</i></font><font> tomask79:spring-service1 tomask79$ curl http:</font><font><i>//192.168.99.100:32391/service1</i></font><font> {</font><font>"timestamp"</font><font>:</font><font>"2018-12-23T19:57:12.020+0000"</font><font>, </font><font>"status"</font><font>:500,</font><font>"error"</font><font>:</font><font>"Internal Server Error"</font><font>, </font><font>"message"</font><font>:</font><font>"Error creating bean with name 'ribbhttps:</font><font><i>//github.com/fabric8io/kubernetes-client]fabric8 kubernetes客户端[/url] 无法在默认命名空间中检索端点数据。</i></font><font> 要理解为什么让我们重复关于Kubernetes的基本规则: <ul> <li>在pod内运行的每个进程都在[url=https:</font><font><i>//kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/]服务帐户[/url]标识下运行。</i></font><font> <li>如果未指定,则每个pod都在“<b>default</b>”服务账户下运行。 <li>为了使pod获得K8s端点元数据,对应的默认服务账户的特权 需要获得至少是“view”clusterrole。 </ul> 只要</font><font>"view"</font><font> readonly [url=https:</font><font><i>//kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles]clusterrole[/url] 就好:</i></font><font> <p>[code]$ kubectl create rolebinding <b>default</b>-view-binding --clusterrole=view --serviceaccount=<b>default</b>:<b>default</b> --namespace=<b>default</b> rolebinding.rbac.authorization.k8s.io/<b>default</b>-view-binding created </font>
再次curl调用/service1 端点:
$ curl http:<font><i>//192.168.99.100:32391/service1</i></font><font> Hello I'm Service1 ->Hello I'm service2 </font>
成功,我们通过一个K8s服务的名字调用在同一名称空间内的服务!
服务发现,不同的命名空间,不同的pods
这一次让我们通过知道它的名字来尝试调用生活在分离命名空间中的kubernetes服务 。只需很少的编码更改即可支持此功能!
首先让我们创建名为“test”的新命名空间:
$ kubectl create namespace test
现在让我们将service2-chart安装到新的命名空间中(这里你需要helm ):
$ helm install -n service2-chart --namespace test service2-chart-0.1.0.tgz
下一步是告诉service1中的ribbon在哪里查找刚刚安装的service2-chart服务。
默认情况下,它列出当前名称空间中的端点。要告诉他在另一个名称空间中搜索service2-chart, 您需要将以下属性添加到application.properties中:
service2-chart.ribbon.KubernetesNamespace=test
现在让我们重建并重新安装service1应用程序到K8s集群,默认命名空间:
- $ mvn clean install
- $ helm package ./service1-chart --debug
- $ helm install -n service1-chart service1-chart-0.1.0.tgz
这是测试之前所需的输出(注意命名空间):
$ helm list NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE service1-chart 1 Sun Dec 23 22:45:24 2018 DEPLOYED service1-chart-0.1.0 1.0 <b>default</b> service2-chart 1 Sun Dec 23 22:09:00 2018 DEPLOYED service2-chart-0.1.0 1.0 test
好的,让我们尝试调用service1-chart服务,该服务在另一个命名空间中调用service2-chart:
$ minikube service service1-chart --url http:<font><i>//192.168.99.100:30176</i></font><font> tomask79:spring-service1 tomask79$ curl http:</font><font><i>//192.168.99.100:30176/service1</i></font><font> {</font><font>"timestamp"</font><font>:</font><font>"2018-12-23T21:47:00.649+0000"</font><font>,</font><font>"status"</font><font>:500,</font><font>"error"</font><font>:</font><font>"Internal Server Error"</font><font>, </font><font>"message"</font><font>:</font><font>"Error creating bean with name 'ribbview --serviceaccount=<b>default</b>:<b>default</b> clusterrolebinding.rbac.authorization.k8s.io/test-view created </font>
现在让我们再次调用service1-chart:
$ curl http:<font><i>//192.168.99.100:30176/service1</i></font><font> Hello I'm Service1 ->Hello I'm service2 </font>
好的,这次我们通过知道它的名字来调用生活在分离命名空间中的kubernetes服务 。我喜欢这种方法,因为您可以在不更改代码的情况下将您的微服务服务发现机制迁移 到kubernetes。
点击标题见原文!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 微服务化之服务拆分与服务发现
- 微服务化之服务拆分与服务发现
- 小白入门微服务(4) - 服务注册与服务发现
- 轻松构建微服务之服务注册和发现
- 轻松构建微服务之服务注册和发现
- 7、服务发现&服务消费者Ribbon
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
计数组合学(第一卷)
斯坦利 / 付梅、侯庆虎、辛国策 / 高等教育 / 2009-6 / 42.00元
《计数组合学(第1卷)》是两卷本计数组合学基础导论中的第一卷,适用于研究生和数学研究人员。《计数组合学(第1卷)》主要介绍生成函数的理论及其应用,生成函数是计数组合学中的基本工具。《计数组合学(第1卷)》共分为四章,分别介绍了计数(适合高年级的本科生),筛法(包括容斥原理),偏序集以及有理生成函数。《计数组合学(第1卷)》提供了大量的习题,并几乎都给出了解答,它们不仅是对《计数组合学(第1卷)》正......一起来看看 《计数组合学(第一卷)》 这本书的介绍吧!