microk8s上部署授权服务
在前文,我们已经成功部署了 互为镜像的注册中心,然后部署了配置中心,并把配置中心注册到注册中心中。在本文,我们将尝试将API网关服务和授权服务注册到注册中心,并且启用配置中心的配置来初始化这两个服务。
先来看看授权服务,它需要通过配置中心服务获取自己的配置的配置,并初始化自己;这里, 我们主要来看授权服务怎么通过注册中心正确获取配置中心服务得服务地址,并访问配置中心,获取启动参数。
在k8s里,每个服务都已pod方式启动,但是使用pod的地址访问服务是不可靠的。 所以,我们需要借助service本身的clusterIP,或者dns,作为对外提供服务的地址。通常,service的dns就是[服务名].[命名空间].src.... 一个比较长的表达。通常我们使用[服务名].[命名空间]就可以了。
首先,我们来看看config-service的能不能用k8s的服务名直接处理
Eureka 默认提供给client的服务格式是“主机名+端口”,而我们只希望使用k8s的服务名来连接实例。根据Eureka client的说明,我尝试了使用virtualHostName来设置config服务在k8s中的服务名,但是发现服务日志中会报“找不到实例”的错误,看来这个属性不合适。
没有找到能够直接设置域名优先的参数,我们决定利用IP来曲折实现目标。这里,我们需要检查并修改config-central服务的configmap文件:
Notes:“同时需要确定eureka.instance.preferIpAddress= true 已经被设置”

修改完成后,重新应用配置中心服务 的configmap 和的deployment文件。 配置中心服务的部署参考:在microk8s上部署springcloud的配置中心服务.
登陆eureka的管理界面,并通过restful api访问config-central,可以看到hostname是以IP的形式显示的。

紧接着,我们来部署授权服务
与config-central服务的部署方式相似,我们需要创建授权服务(authorize)的configmap 文件, 和deployment文件。
Deployment的文件的创建与config-central没有什么区别,详细可参考后文。
完成以上工作后,我们启动了authorize服务,可以发现,在获得config-server的信息以后,authorize使用IP+端口来访问配置中心。

查看授权服务的启动日志,我们会发现,我们从注册中心服务获得的是配置服务的IP:端口格式。 现在,我们需要尝试把IP替换成k8s的service名字。
接下来我们用 服务名代替IP
继续修改config-central的configmap配置文件, 显式的设置IP地址和端口:
eureka.instance.ip-address= configcentral.default
eureka.instance.ip-nonSecurePort= 8001

再次部署config-central-configmap.yaml文件后, 有一次从eureka 访问注册成功的配置文件。
如下图,可以看到,地址、主机名等关键信息已经成功替换成了了config-central service的名字,这样可以达到我们的目标了。

再次部署authorize-deployment, 通过kubetcl logs 查看创建的pod的日志, 我们可以看到,系统通过 http://configcentral.default:8080/的地址访问配置中心,这正是我们期望的。

现在我们再来看看授权服务的配置文件
授权服务将通过注册中心发现配置服务,并通过配置服务获取自己的参数配置。 它的k8s配置文件如下,黄色部分一定要填写正确。我们的配置中心对某个应用的访问格式是:
http://[配置中心]:[端口]/[应用名称]/[profile]
前半部分有注册中心提供,后半部分在配置文件中体现。

另外,在k8s中其实可以使用配置服务的service名称和端口,访问配置服务,更加方便,只需要增加一下参数。
spring.cloud.config.uri= http://configcentral.default:9001/

创建了configmap文件, 还需要创建Deployment文件。授权服务的Deployment文件如下,这里 我们将使用bootstrap.properties作为springboot的属性文件。

编写完以上文件后,就可以启动服务了。
初次在microk8s上部署以上文件,发现授权服务没有正常启动,错误是datasource没有初始化成功。最后将用户名、密码参数写在命令行中进行了解决; 看来spring的配置机制还是挺复杂。
启动成功后,为授权服务声明一个service,使用nodeport方式,这里仅仅方便测试:

最后,通过postman,调用接口做一下测试,返回结果看起来完全工作了。

到此,授权服务部署完成,这个过程主要做了下面的事情:
1. 修改配置服务的configmap文件,使用优先IP获取服务方式。
IP prefer字段,实际填充配置服务在k8s中的服务名。
2. 将授权服务的配置放到authorize-configmap中,使用服务发现的方式找寻配置服务。
创建deployment文件,部署服务。
Notes: 还是对spring的参数加载不够熟悉,部分密码属性需要放在命令行中,但这个影响不大,我们可以创建k8s的secret来处理。 在k8s上部署springcloud的配置服务问题不大,但是如果部分参数不起效果,需要修改代码,则得不偿失。 在k8s中完全可以用configmap和secret代替。
通过部署授权服务,我们解决了微服务于springboot配置中心的集成,紧接着我们再部署一个网关服务。网关服务对外提供统一的API服务,在这个过程中需要调用授权服务,对用户进行授权验证;通过这个过程,我们将来看看,k8s中微服之间的调用怎么做。