新乡个人网站建设价格,wordpress数据插件,seo搜索引擎优化网站,专注网站搭建的公司1.如何容器化部署mysql
2. 如何容器化部署nacos
为不暴露我的服务器地址#xff0c;本文全部使用localhost来代替服务器地址#xff0c;所有的localhost都应该调整为你自己的服务器地址。 为不暴露我的服务器地址#xff0c;本文全部使用localhost来代替服务器地址#x…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?serverTimezoneAsia/ShanghaiautoReconnecttrueuseUnicodetruecharacterEncodingUTF-8allowMultiQueriestrueuseSSLfalseusername: rootpassword: your_passworddruid:# 初始连接数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.IdEntity
JsonIgnoreProperties(value [hibernateLazyInitializer, handler, fieldHandler])
class Depart {IdGeneratedValue(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.ServiceService
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 :JpaRepositoryDepart,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) departServiceGetMapping(/get/{id})fun getHandle(PathVariable id: Int) departService.getDepartById(id)GetMapping(/list)fun listHandle() departService.findAllDeparts()GetMapping(/discovery)fun discoveryHandle(): ListString {//获取所有的服务名称val services: ListString discoveryClient.servicesfor (service in services) {// 获取指定微服务名称的所有微服务实例var instances discoveryClient.getInstances(service)for (instance in instances) {
// val map HashMapString, Any()val map mutableMapOfString, 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.getForObjectRestController
RequestMapping(/consumer/depart)
RequiredArgsConstructor
class DepartController(private val template:RestTemplate) {//直连方式
// final val SERVICE_PROVIDER_DEPARThttp://localhost:8081/provider/depart///微服务方式final val SERVICE_PROVIDER_DEPARThttp://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 urlSERVICE_PROVIDER_DEPARTdeltemplate.delete(urlid)}//改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/$idreturn template.getForObject(url,Depart::class.java)}//查全部GetMapping(/list)fun listHandle():ListDepart?{val url$SERVICE_PROVIDER_DEPART/listreturn template.getForObject(url,ArrayDepart::class.java)?.toList()}}这些都完成之后就可以启动两个服务进行测试了。 有任何问题欢迎私信我或者添加我的联系方式我会很乐于交流