Spring Cloud Kubernetes之实战服务注册与发现

简介: 本文主讲利用 k8s 来实现服务的注册与发现,甚至负载均衡,这在云原生时代又是一新型技术发展。

环境

  • ubuntu16.04
  • docker18.04
  • k8s1.13.x +
  • maven3.5.3
  • java1.8 +
  • springboot 2.1.1
  • spring-cloud-kubernetes:1.0.1.RELEASE

我们都知道,涉及到微服务,那必体现六个字,"高内聚,低耦合",所以针对不同业务或应用场景,服务模块化很重要,这个不再赘述了。咱们先来创建服务提供方,同样,利用eclipse或IDEA创建一个项目,此处略了。

创建好项目之后,首先引入依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-kubernetes-core</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-kubernetes-discovery</artifactId>
</dependency>

        <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-ribbon</artifactId>
</dependency>

        <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

其他数据库,中间件等,可根据项目自行添加。

同样,我们需要配置初始化bean,这就涉及到配置文件bootstrap.yaml:

spring:
  application:
    name: demo-cas
  cloud:
    kubernetes:
      discovery:
        all-namespaces: true

下面,我们看看application的配置:

server:
  port: 1000
  undertow:
    accesslog:
      enabled: false
      pattern: combined
  servlet:
    session:
      timeout: PT120M

到这,基本的配置即完成,同样,我们也引入了k8s的configmap功能,可以新建configmap的yaml文件来创建其configmap。

然后最重要的一点,就是我们需要创建service:

apiVersion: v1
kind: Service
metadata:
  name: demo-cas-service
  namespace: default
spec:
  ports:
  - name: cas01
    port: 1000
    targetPort: cas01
  selector:
    app: demo-cas

这一点很关键,即实现了服务的注册。

然后服务提供者的项目架子搭建好了,自己可以添加一些内容,比如我把它作为微服务架构的统一鉴权中心CAS。

接下来创建服务消费者的项目,同样引入依赖,但这一次不同:

<dependency>
    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-kubernetes-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-ribbon</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
 <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

以上是服务消费者的必须依赖,其他的可根据项目自行添加,比如:在线文档swagger,数据库,json解析,权限管理shiro等。

同样,我们也需要配置初始化bean,这就涉及到配置文件bootstrap.yaml:如上

接下来需要配置服务消费者的消费逻辑以及实现负载均衡的策略(application.yaml):

server:
  port: 1002
  undertow:
    accesslog:
      enabled: false
      pattern: combined
  servlet:
    session:
      timeout: PT120M

这是针对所有的提供者服务的消费策略:  

backend:
  ribbon:
    eureka:
      enabled: false
    client:
      enabled: true
    ServerListRefreshInterval: 5000

ribbon:
  ConnectTimeout: 3000
  ReadTimeout: 1000
  eager-load:
    enabled: true
    clients: demo-cas-service,cloud-admin-service
  MaxAutoRetries: 1 #对第一次请求的服务的重试次数
  MaxAutoRetriesNextServer: 1 #要重试的下一个服务的最大数量(不包括第一个服务)
  #listOfServers: localhost:5556,localhost:5557
  #ServerListRefreshInterval: 2000
  OkToRetryOnAllOperations: true
 NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RoundRobinRule

这样,服务提供者与服务消费者就都新建成功了,接下来就需要丰满自己的业务应用逻辑了,同样,消费者也可以创建configmap来配置管理自己的配置。

这里,消费者调用提供者,提供者是个cas服务,则:

MultiValueMap<String, String> map = new LinkedMultiValueMap<>();

map.add("username", username);

map.add("password", password);

logger.info("CAS URL: {}", envConfig.getCas_url());

String respBody = HttpRequestUtil.doPostForm(restTemplate, envConfig.getCas_url(), map);

if (StringUtils.isNotBlank(respBody)) {

JSONObject pobj = JSON.parseObject(respBody);

Object object = pobj.get("message");

Integer code = JSON.parseObject(object.toString()).getInteger("code");

if (code == LoginEnum.LOGIN_SUCCESS.getSeq()) {

Object data = pobj.get("data");

SysUserDto sysUser = JSON.parseObject(data.toString(), SysUserDto.class);

return sysUser;

}

}

这里的环境变量即使configmap提供,值:cas_url: http://demo-cas-service/login,这样我们就完成了调用的逻辑。

接下来我们如果需要测试LB,需要添加一条脚本:

增加pod:

kubectl scale --replicas=2 deployment demo-cas-deployment

这样,我们既看到两个demo-cas-deployment的pod:

同样测试,根据策略轮询调用的方式,这次会请求到该pod上,这里不贴截图了,大家可以试试。

上面分享的是通过service的方式提供了服务的注册与发现,而且单机的k8s本身也不重,所以操作起来也非常之简单。避免了springboot原生提供的eureka、阿里的nacos、zk来作分布式的服务注册与发现要简单的多。减轻系统的繁重,以及避免了系统的冗余。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
人工智能 Java Serverless
【MCP教程系列】搭建基于 Spring AI 的 SSE 模式 MCP 服务并自定义部署至阿里云百炼
本文详细介绍了如何基于Spring AI搭建支持SSE模式的MCP服务,并成功集成至阿里云百炼大模型平台。通过四个步骤实现从零到Agent的构建,包括项目创建、工具开发、服务测试与部署。文章还提供了具体代码示例和操作截图,帮助读者快速上手。最终,将自定义SSE MCP服务集成到百炼平台,完成智能体应用的创建与测试。适合希望了解SSE实时交互及大模型集成的开发者参考。
14561 60
|
12月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
392 0
|
9月前
|
运维 Kubernetes 持续交付
ACK One GitOps:让全球化游戏服务持续交付更简单
ACK One GitOps 致力于提供开箱即用的多集群 GitOps 持续交付能力,简化游戏等服务的多集群/多地域统一部署,让您更加专注于业务开发。
|
9月前
|
Prometheus 监控 Cloud Native
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务实现步骤
770 0
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
1087 33
|
人工智能 自然语言处理 Java
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
8882 7
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
746 5
|
Kubernetes 持续交付 数据库
阿里云ACK+GitLab企业级部署实战教程
GitLab 是一个功能强大的基于 Web 的 DevOps 生命周期平台,整合了源代码管理、持续集成/持续部署(CI/CD)、项目管理等多种工具。其一体化设计使得开发团队能够在同一平台上进行代码协作、自动化构建与部署及全面的项目监控,极大提升了开发效率和项目透明度。 GitLab 的优势在于其作为一体化平台减少了工具切换,高度可定制以满足不同项目需求,并拥有活跃的开源社区和企业级功能,如高级权限管理和专业的技术支持。借助这些优势,GitLab 成为许多开发团队首选的 DevOps 工具,实现从代码编写到生产部署的全流程自动化和优化。
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
946 7

推荐镜像

更多