容器化nacos部署并实现服务发现(gradle)

1.如何容器化部署mysql
2. 如何容器化部署nacos

为不暴露我的服务器地址,本文全部使用localhost来代替服务器地址,所有的localhost都应该调整为你自己的服务器地址。
为不暴露我的服务器地址,本文全部使用localhost来代替服务器地址,所有的localhost都应该调整为你自己的服务器地址。

容器化nacos并实现服务发现

  • 本文使用技术:springclod、springcloudAlibaba、kotlin、jpa、gradle
创建项目
  • 创建empty project
    在这里插入图片描述

  • 选择jdk17、语言等级17

新建provider模块

  • 新建模块(命名为provider) 选择spring 3.0.2
  • 依赖添加spring data jpa、spring web、lombok
  • 添加mysql连接池依赖
dependencies {  
// other denpendenciesimplementation 'mysql:mysql-connector-java:8.0.26'  implementation("com.alibaba:druid:1.2.20")
// other denpendencies
}
  • mvn官网查询springcloud的导入方式,springcloud的github页面查询版本对应关系
  • mvn官网查询springcloudalibaba,引入springcloudalibaba对应版本
  • 引入spring-cloud-alibaba-nacos-discovery
ext {set('springCloudVersion', "2022.0.0")set('springCloudAlibabaVersion', "2022.0.0.0") // 设置Spring Cloud Alibaba的版本号
}repositories {//阿里源maven { url 'https://maven.aliyun.com/repository/public' }mavenCentral()
}dependencies {
...implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2022.0.0.0'
...
}dependencyManagement {imports {mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}" // 导入Spring Cloud Alibaba BOM}
}
  • 开放服务器8848、9848端口

  • 配置application(更改数据库地址和账户密码即可)

spring:cloud:nacos:discovery:# nacos注册中心地址server-addr: 127.0.0.1:8848username: nacospassword: nacos# 微服务名称application:name: depart-providerjpa:# 指定是否在spring容器启动时创建表,默认falsegenerate-ddl: trueshow-sql: truehibernate:# 指定应用重启时不重新更新表ddl-auto: none# 关闭前端访问的懒加载机制open-in-view: false# 配置数据源datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1/rdtcloud?serverTimezone=Asia/Shanghai&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=falseusername: rootpassword: 'your_password'druid:# 初始连接数initialSize: 5# 最小连接池数量minIdle: 10# 最大连接池数量maxActive: 20# 配置获取连接等待超时的时间maxWait: 60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒minEvictableIdleTimeMillis: 300000# 配置一个连接在池中最大生存的时间,单位是毫秒maxEvictableIdleTimeMillis: 900000# 配置检测连接是否有效validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: false# 日志
logging:# 控制台日志输出格式pattern:console: level-%level %msg%nlevel:# 控制springboot 启动时显示的日志级别root: info# hibernate相关的日志级别org.hibernate: info# 控制自己写的代码运行时显示的日志级别com.rdt: debug#  show-sql: true 的前提下显示sql中的动态参数值org.hibernate.type.descriptor.sql.BasicBinder: trace#  show-sql: true 的前提下显示sql的查询结果org.hibernate.type.descriptor.sql.BasicExtractor: traceserver:port: 8081servlet:encoding:charset: utf-8# 确保字符集总是被应用force: true

新建consumer模块

  • 新建模块(命名为provider) 选择spring 3.0.2
  • 依赖添加spring web、lombok
  • 引入provider0引入的微服务依赖内容(spring、springcloudalibaba、nacos-discovery)
ext {set('springCloudVersion', "2022.0.0")set('springCloudAlibabaVersion', "2022.0.0.0") // 设置Spring Cloud Alibaba的版本号
}repositories {//阿里源maven { url 'https://maven.aliyun.com/repository/public' }mavenCentral()
}dependencies {
...implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2022.0.0.0'
...
}dependencyManagement {imports {mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}" // 导入Spring Cloud Alibaba BOM}
}
  • 配置consumer的yml
spring:cloud:nacos:discovery:# nacos注册中心地址server-addr: 127.0.0.1:8848username: nacospassword: nacos# 微服务名称application:name: depart-consumer
  • 以上配置完成,启动provider和consumer,可以在注册中nacos中找到这两个服务
  • 如何容器化配置并启动nacos在文章开头的链接中
    在这里插入图片描述

consumer和provider通信

provider代码测试

使用传统的三层架构就可以

  • 实体类
package com.rdt.provider8081.beanimport com.fasterxml.jackson.annotation.JsonIgnoreProperties
import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id@Entity
@JsonIgnoreProperties(value = ["hibernateLazyInitializer", "handler", "fieldHandler"])
class Depart {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)val id: Int? = nullvar name: String? = null}
  • 服务层
package com.rdt.provider8081.serviceimport com.rdt.provider8081.bean.Depart
import com.rdt.provider8081.repository.DepartRepository
import lombok.RequiredArgsConstructor
import org.springframework.stereotype.Service@Service
@RequiredArgsConstructor
class DepartService(private val departRepository: DepartRepository) {fun saveDepart(depart: Depart) = departRepository.save(depart)fun removeDepart(id: Int) {if (departRepository.existsById(id) != null)departRepository.deleteById(id)}fun getDepartById(id: Int): Depart {if (departRepository.existsById(id)) {return departRepository.getReferenceById(id)} else {return Depart()}}fun modifyDepart(depart: Depart): Depart {if (departRepository.existsById(depart.id!!)) {return departRepository.save(depart)}return Depart()}fun findAllDeparts() = departRepository.findAll()}
  • 持久层
package com.rdt.provider8081.repository  import com.rdt.provider8081.bean.Depart  
import org.springframework.data.jpa.repository.JpaRepository  interface DepartRepository :JpaRepository<Depart,Int>{  
}
  • 视图层
package com.rdt.provider8081.controllerimport com.rdt.provider8081.bean.Depart
import com.rdt.provider8081.service.DepartService
import lombok.RequiredArgsConstructor
import org.springframework.cloud.client.discovery.DiscoveryClient
import org.springframework.web.bind.annotation.*@RestController
@RequiredArgsConstructor
@RequestMapping("/provider/depart")
class DepartController(private val departService: DepartService, private val discoveryClient: DiscoveryClient
) {@PostMapping("/")fun saveHandle(@RequestBody depart: Depart) {println(depart.name)departService.saveDepart(depart)}@DeleteMapping("/{id}")fun deleteHandle(@PathVariable("id") id: Int) {return departService.removeDepart(id)}@PutMapping("/")fun updateHandle(@RequestBody depart: Depart) = departService@GetMapping("/get/{id}")fun getHandle(@PathVariable id: Int) = departService.getDepartById(id)@GetMapping("/list")fun listHandle() = departService.findAllDeparts()@GetMapping("/discovery")fun discoveryHandle(): List<String> {//获取所有的服务名称val services: List<String> = discoveryClient.servicesfor (service in services) {// 获取指定微服务名称的所有微服务实例var instances = discoveryClient.getInstances(service)for (instance in instances) {
//                val map = HashMap<String, Any>()val map = mutableMapOf<String, Any>()map["serviceName"] = servicemap["serviceId"] = instance.serviceIdmap["serviceHost"] = instance.hostmap["servicePort"] = instance.portmap["uri"] = instance.uriprintln(map)}}return services}}

Consumer代码测试

  • 注意,目前新版的springcloudAlibaba已经弃用了ribbon,所以负载均衡需要引入依赖
  • consumer不需要持久层,consumer是调用provider的,它不与数据库交互
dependencies{//nacos-discover引入implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer:4.0.4'
}
  • 实体层
package com.rdt.consumer8080.beanclass Depart {var id:Int?=nullvar name:String?=null
}
  • 配置类
  • consumer需要配置类,在视图层需要使用
package com.rdt.consumer8080.config  import org.springframework.cloud.client.loadbalancer.LoadBalanced  
import org.springframework.context.annotation.Bean  
import org.springframework.context.annotation.Configuration  
import org.springframework.web.client.RestTemplate  @Configuration  
class DepartConfig {  @LoadBalanced //以负载均衡的方式调用  
@Bean  
public fun restTemplate():RestTemplate{  
return RestTemplate()  
}  }
  • 视图层
package com.rdt.consumer8080.controllerimport com.google.gson.GsonBuilder
import com.rdt.consumer8080.bean.Depart
import com.rdt.consumer8080.consts.ConstTime
import lombok.RequiredArgsConstructor
import org.springframework.core.ParameterizedTypeReference
import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.PutMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.client.RestTemplate
import org.springframework.web.client.getForObject@RestController
@RequestMapping("/consumer/depart")
@RequiredArgsConstructor
class DepartController(private val template:RestTemplate) {//直连方式
//    final val SERVICE_PROVIDER_DEPART="http://localhost:8081/provider/depart/"//微服务方式final val SERVICE_PROVIDER_DEPART="http://depart-provider/provider/depart/"//增@PostMapping("/")fun saveHandle(@RequestBody depart:Depart):Boolean?{return template.postForObject(SERVICE_PROVIDER_DEPART, depart, Boolean::class.java)}//删@DeleteMapping("/del/{id}")fun deleteHandle(@PathVariable("id") id:Int){val url=SERVICE_PROVIDER_DEPART+"del"template.delete(url+id)}//改@PutMapping("/")public fun updateHandle(@RequestBody depart: Depart){template.put(SERVICE_PROVIDER_DEPART,depart)}//查单个@GetMapping("/get/{id}")fun getHandle(@PathVariable("id") id:Int):Depart?{val url:String= "$SERVICE_PROVIDER_DEPART/get/$id"return  template.getForObject(url,Depart::class.java)}//查全部@GetMapping("/list")fun listHandle():List<Depart>?{val url="$SERVICE_PROVIDER_DEPART/list"return template.getForObject(url,Array<Depart>::class.java)?.toList()}}

这些都完成之后就可以启动两个服务进行测试了。
有任何问题欢迎私信我,或者添加我的联系方式,我会很乐于交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/143487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Libra R-CNN: Towards Balanced Learning for Object Detection(2019.4)

文章目录 AbstractIntroduction引入问题1&#xff09; Sample level imbalance2) Feature level imbalance3) Objective level imbalance进行解决贡献 Related Work&#xff08;他人的work&#xff0c;捎带与我们的对比&#xff09;Model architectures for object detection&a…

突发!奥特曼宣布暂停ChatGPT Plus新用户注册!

大新闻&#xff01;就在刚刚&#xff01; OpenAI的CEO Sam Altman宣布暂停ChatGPT Plus 新用户注册&#xff01; Sam Altman对此解释道&#xff1a; 由于OpenAI开发日后ChatGPT使用量的激增超出了我们的承受能力&#xff0c;我们希望确保每个人都有良好的体验。 您仍然可以在a…

msvcp120.dll下载_msvcp120.dll文件丢失解决[dll系统文件修复]

msvcp120.dll是Microsoft Visual C库中的一个重要组件&#xff0c;属于Microsoft Visual C 2005 Redistributable Package。它提供了许多用于执行C程序所需的函数。Visual C是一款流行的集成开发环境&#xff08;IDE&#xff09;&#xff0c;广泛应用于游戏、视频和图形处理等领…

keepalived+haproxy配置集群和负载均衡

1、简介 1.1. Keepalived Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备…

【PyQt小知识 - 2】:QTextEdit内容的更新和获取、隐藏或显示滚动条、光标插入文本、文本自适应移动

文章目录 QTextEdit更新和获取内容隐藏或显示滚动条光标插入文本文本自适应移动 QTextEdit 更新和获取内容 更新&#xff1a;QTextEdit().setText(text) 或 QTextEdit().setPlainText(text) 获取&#xff1a;QTextEdit().toPlainText() setText()和setPlainText()的区别&…

大文件分片上传、断点续传、秒传

小文件上传 后端&#xff1a;SpringBootJDK17 前端&#xff1a;JavaScriptsparkmd5.min.js 一、依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.2</ve…

1 Supervised Machine Learning Regression and Classification

文章目录 Week1OverViewSupervised LearningUnsupervised LearningLinear Regression ModelCost functionGradient Descent Week2Muliple FeatureVectorizationGradient Descent for Multiple RegressionFeature ScalingGradient DescentFeature EngineeringPolynomial Regress…

UE5 - UI Material Lab 学习笔记

1、学习资料收集 UI Material Lab : https://www.unrealengine.com/marketplace/zh-CN/product/ui-material-lab 视频1&#xff1a;https://www.bilibili.com/video/BV1Hm4y1t7Kn/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 视…

记录一次 添加脚本的记录+改错记录

1.Update 和 Delete 一定要记得where条件 update 表名称 set 字段1‘修改的值’ &#xff08;单引号&#xff09; where 字段‘’ and Aid‘’; update jxkh22 set JXKH2200001 ,JXKH2201002 where B003 and JXKH22034;delete from table_name where condition delete from …

Linux控制---进程程序替换

前言&#xff1a;前面我们学洗了Linux进程退出的相关知识&#xff0c;了解了什么是进程退出&#xff0c;已经进程等待的相关话题&#xff0c;今天&#xff0c;我们来学习Linux中的进程程序替换&#xff0c;进程程序替换在Linux中可以用于实现新程序的启动、程序升级、多进程程序…

11.10 知识总结(数据的增删改查、如何创建表关系、Django框架的请求生命周期流程图)

一、 数据的增删改查 1.1 用户列表的展示 把数据表中得用户数据都给查询出来展示在页面上 添加数据 id username password gender age action 修改 删除 1.2 修…

【数据库开发】DataX开发环境的安装部署(Python、Java)

文章目录 1、简介1.1 DataX简介1.2 DataX功能1.3 支持的数据通道 2、DataX安装配置2.1 DataX2.2 Java2.3 Python 3、DataX Web安装配置3.1 mysql3.2 DataX Web3.2.1 简介3.2.2 架构图3.2.3 依赖环境3.2.4 安装 4、入门使用4.1 DataX自带打印示例测试4.2 DataX生成任务模板文件4…

kubernetes集群编排——istio

官网&#xff1a;https://istio.io/latest/zh/about/service-mesh/ 部署 [rootk8s2 ~]# tar zxf istio-1.19.3-linux-amd64.tar.gz [rootk8s2 ~]# cd istio-1.19.3/[rootk8s2 istio-1.19.3]# export PATH$PWD/bin:$PATH demo专为测试准备的功能集合 [rootk8s2 istio-1.19.3]# i…

Linux文件系统之inode

文章目录 1. 磁盘1.1 认识磁盘1.2 磁盘物理构造1.3 磁盘逻辑结构 2. 文件系统3. 如何理解目录 1. 磁盘 1.1 认识磁盘 文件 内容 属性&#xff0c;而文件是存储在磁盘上&#xff0c;那么可以理解为磁盘上存储的文件 存储的文件内容 存储的文件属性。 文件的内容采用的是块式…

kube-bench-CIS基准的自动化扫描工具学习

仓库地址&#xff1a;GitHub - aquasecurity/kube-bench: Checks whether Kubernetes is deployed according to security best practices as defined in the CIS Kubernetes Benchmark kube-bench,检查 Kubernetes 是否根据 CIS Kubernetes 基准中定义的安全最佳实践部署,下载…

应用协议安全:Rsync-common 未授权访问.

应用协议安全&#xff1a;Rsync-common 未授权访问. Rsync 是 Linux 下一款数据备份工具&#xff0c;支持通过 rsync 协议、ssh 协议进行远程文件传输。其中 rsync 协议默认监听 873 端口&#xff0c;如果目标开启了 rsync 服务&#xff0c;并且没有配置 ACL 或访问密码&#…

Redis05-集群方案

目录 Redis集群方案 主从复制 主从复制的基本原理 主从复制的工作流程 乐观复制 主从复制的优势 哨兵机制 哨兵的关键作用 服务状态监控 哨兵选举Master规则 分片集群 分片集群中的数据读写 数据写入 数据读取 一致性哈希和客户端分片 Redis集群方案 微服务时代…

TDengine 与煤科院五大系统实现兼容性互认,助力煤矿智能化安全体系搭建

近日&#xff0c;涛思数据与煤炭科学技术研究院&#xff08;以下简称煤科院&#xff09;已完成数个产品兼容互认证工作&#xff0c;经双方共同严格测试&#xff0c;涛思数据旗下物联网、工业大数据平台 TDengine V3.X 与煤炭科学技术研究院旗下煤矿复合灾害监测监控预警系统、煤…

Elasticsearch docker-compose 使用 Logstash 从 JSON 文件中预加载数据

在我们创建 Elasticsearch 进行开发时&#xff0c;最简单的办法就是在本地使用 docker-compose 来一键部署一个 Elasticsearch 集群。有时&#xff0c;特别是在准备测试环境时&#xff0c;开发人员希望从一开始就创建包含一些测试数据的数据库容器。我们可以使用 Logstash 来很…