服务治理:管理每个服务之间的依赖关系,可以实现服务调用,负载均衡,容错,实现服务注册与发现。
注册中心:当服务启动时,就会将服务地址等相关信息存在注册中心,管理每个服务与服务之间的依赖关系。
(1)介绍
包括两个组件:
Eureka Server:
服务注册:将服务信息注册进注册中心;
服务发现:从注册中心获取服务信息;
实质:存key服务命令,取value调用地址;Eureka Cilent:Java客户端,用于简化Server交互,内置负载均衡器,在服务启动后默认30秒向Eureka Server发送心跳,如果多周期没有接收到,将会移除该服务。(默认90秒)
(2)单集群使用
1.2.1 注册中心搭建
pom.xml
cloud2022 org.example 1.0-SNAPSHOT 4.0.0 com.cloud-eureka cloud-eureka com.commons commons 1.0-SNAPSHOT compile org.springframework.cloud spring-cloud-starter-netflix-eureka-server 2.2.10.RELEASE org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator com.baomidou mybatis-plus-boot-starter com.alibaba druid-spring-boot-starter 1.1.10 mysql mysql-connector-java org.springframework.boot spring-boot-starter-jdbc org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-devtools runtime true
yml
server:
port: 7001
eureka :
instance :
hostname: localhost #服务端实例名称
client:
register-with-eureka: false #false表示不注册自己
fetch-registry: false
service-url:
#交互查询地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
采坑2:
如果pom.xml引入数据库相关依赖,需要配置数据源;
需要application:name;
完成yml
server:
port: 7001
eureka:
instance:
hostname: 127.0.0.1
client:
register-with-eureka: false #是否将自己注册到eureka中
fetch-registry: false #是否从eureka中获取信息
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#defaultZone: http://localhost:1234/eureka/
spring:
application:
name: eureka
datasource:
url: jdbc:mysql://localhost:3306/springboot-mybatisplus?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
username: root
password: 123456
driver-class-name=com: mysql.cj.jdbc.Driver
# type: com.alibaba.druid.pool.DruidDataSource
#2、mybatis-plus配置
mybatis-plus:
#2-1 lodging 日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#2-2 deleted 逻辑删除
global-config :
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
# mapper-locations: classpath:mapper/*.xml
主启动类:@EnableEurekaServer
package com.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication(scanbasePackages = "com.eureka")
//@MapperScan("com.payment.Mapper")
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
目录:
访问:http://localhost:7001/
结果:
1.2.2 注册支付模块
支付模块引入cilent依赖
cloud2022 org.example 1.0-SNAPSHOT com.payment8001 4.0.0 payment8001 org.springframework.cloud spring-cloud-starter-netflix-eureka-client 3.0.5 com.commons commons 1.0-SNAPSHOT compile org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator com.baomidou mybatis-plus-boot-starter com.alibaba druid-spring-boot-starter 1.1.10 mysql mysql-connector-java org.springframework.boot spring-boot-starter-jdbc org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-devtools runtime true
主启动类激活注册注解
package com.payment;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication(scanbasePackages = "com.payment")
@EnableEurekaClient
public class PaymentApplication {
public static void main(String[] args) {
SpringApplication.run(PaymentApplication.class, args);
}
}
yml文件配置cilent
#注意application:name 、是否注册
server:
port: 8001
eureka:
client:
register-with-eureka: true #是否要注册
fetchRegistry: true #是否抓取注册信息
service-url:
defaultZone: http://localhost:7001/eureka
spring:
application:
name : payment8001
datasource:
url: jdbc:mysql://localhost:3306/springboot-mybatisplus?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
username: root
password: 123456
driver-class-name=com: mysql.cj.jdbc.Driver
#2、mybatis-plus配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config :
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
mapper-locations: classpath:mapper/*.xml
采坑3:
提取公共类之后,mapper.xml文件的映射结果集需要修改
启动server与cilent,访问:http://localhost:7001,结果如下:
1.2.3 注册订单模块
与支付模块注册相同
微服务的服务远程调用最核心是高可用;
以上为单集群,以下构造多集群;
(3)多注册中心集群搭建
1.3.1 搭建第二个注册中心Eureka
修改host配置:C:WindowsSystem32driversetc目录
127.0.0.1 eureka1.7001 127.0.0.1 eureka2.7002
相互注册
eureka1.7001的application.yml
server:
port: 7001
eureka:
instance:
hostname: eureka7001
client:
register-with-eureka: false #是否将自己注册到eureka中
fetch-registry: false #是否从eureka中获取信息
service-url:
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7002:7002/eureka
spring:
application:
name: eureka
datasource:
url: jdbc:mysql://localhost:3306/springboot-mybatisplus?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
username: root
password: 123456
driver-class-name=com: mysql.cj.jdbc.Driver
# type: com.alibaba.druid.pool.DruidDataSource
#2、mybatis-plus配置
mybatis-plus:
#2-1 lodging 日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#2-2 deleted 逻辑删除
global-config :
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
# mapper-locations: classpath:mapper/*.xml
eureka2.7002的application.yml
server:
port: 7002
eureka:
instance:
hostname: eureka7002
client:
register-with-eureka: false #是否将自己注册到eureka中
fetch-registry: false #是否从eureka中获取信息
service-url:
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7001:7001/eureka
spring:
application:
name: eureka
datasource:
url: jdbc:mysql://localhost:3306/springboot-mybatisplus?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
username: root
password: 123456
driver-class-name=com: mysql.cj.jdbc.Driver
# type: com.alibaba.druid.pool.DruidDataSource
#2、mybatis-plus配置
mybatis-plus:
#2-1 lodging 日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#2-2 deleted 逻辑删除
global-config :
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
# mapper-locations: classpath:mapper/*.xml
启动两个集群主程序
访问:http://eureka7002:7002/
采坑4:
FreeMarker template error (DEBUG mode; use RETHROW in production!): The following has evaluated to null or missing: ==> replica.key [in template "eureka/navbar.ftlh" at line 68, column 62] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${replica.key} [in template "eureka/navbar.ftlh" at line 68, column 60] - Reached through: #include "navbar.ftlh" [in template "eureka/status.ftlh" at line 22, column 7] ---- Java stack trace (for programmers): ---- freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...] at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:134) at freemarker.core.evalUtil.coerceModelToTextualCommon(evalUtil.java:479) at freemarker.core.evalUtil.coerceModelToStringOrMarkup(evalUtil.java:401) at freemarker.core.evalUtil.coerceModelToStringOrMarkup(evalUtil.java:370) at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:100) at freemarker.core.DollarVariable.accept(DollarVariable.java:63) at freemarker.core.Environment.visit(Environment.java:367) at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:321) at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271) at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244) at freemarker.core.Environment.visitIteratorBlock(Environment.java:643) at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108) at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94) at freemarker.core.Environment.visit(Environment.java:331) at freemarker.core.Environment.visit(Environment.java:337) at freemarker.core.Environment.include(Environment.java:2694) at freemarker.core.Include.accept(Include.java:171) at freemarker.core.Environment.visit(Environment.java:331) at freemarker.core.Environment.visit(Environment.java:337) at freemarker.core.Environment.process(Environment.java:310) at freemarker.template.Template.process(Template.java:383) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:391) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:304) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:255) at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:179) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) at org.springframework.web.servlet.frameworkServlet.processRequest(frameworkServlet.java:1006) at org.springframework.web.servlet.frameworkServlet.doGet(frameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) at org.springframework.web.servlet.frameworkServlet.service(frameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:108) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.Authenticatorbase.invoke(Authenticatorbase.java:526) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEnginevalve.invoke(StandardEnginevalve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591) at org.apache.tomcat.util.net.SocketProcessorbase.run(SocketProcessorbase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)
可能是host不规范或者配置路径不合理导致;
修改hosts以及配置访问成功:
127.0.0.1 eureka7001 127.0.0.1 eureka7002
(4)支付模块与订单模块同时注册进集群
只是defaultZone的修改
server:
port: 8002
eureka:
client:
register-with-eureka: true #是否要注册
fetchRegistry: true #是否抓取注册信息
service-url:
# defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001:7001/eureka,http://eureka7002:7002/eureka
spring:
application:
name : consumer
datasource:
url: jdbc:mysql://localhost:3306/springboot-mybatisplus?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
username: root
password: 123456
driver-class-name=com: mysql.cj.jdbc.Driver
server:
port: 8001
eureka:
client:
register-with-eureka: true #是否要注册
fetchRegistry: true #是否抓取注册信息
service-url:
# defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001:7001/eureka,http://eureka7002:7002/eureka
spring:
application:
name : payment8001
datasource:
url: jdbc:mysql://localhost:3306/springboot-mybatisplus?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
username: root
password: 123456
driver-class-name=com: mysql.cj.jdbc.Driver
启动4个微服务测试
注意启动顺序,需要先启动注册中心;
(5)多服务提供者(支付模块)集群搭建
建一个与payment8001相同的module,server.port = 8002,其他内容一样
Controller小改造:知道是哪个服务返回的数据;
@RestController
@RequestMapping("/payment")
@Slf4j
@RequiredArgsConstructor
public class PaymentController {
private final PaymentService paymentService ;
@Value("${server.port}")
public String serverPort;
@PostMapping("/save")
public Result saveEntity(@RequestBody Payment payment) {
paymentService.saveEntity(payment);
return new Result(200,"成功"+serverPort,"");
}
@GetMapping("/{id}")
public Result saveEntity(@PathVariable("id") Integer id) {
System.out.println(id);
return new Result(200,"成功"+serverPort,paymentService.getPayment(id));
}
}
采坑5:@Value注解要为spring的,非lombok。
访问:http://localhost:8002/payment/1
改造消费订单模块:可以多服务协调(与Eureka服务名称一致)
public static final String payment_URL ="http://PAYMENT"
开启负载均衡
访问:http://localhost:8080/consumer/1
{"code":200,"msg":"成功","date":{"id":1,"name":"999","createTime":null,"updateTime":null,"del":0,"version":1}}
{"code":200,"msg":"成功8002","date":{"id":1,"name":"999","createTime":null,"updateTime":null,"del":0,"version":1}}
(6)actuator信息完善
引入依赖
org.springframework.boot spring-boot-starter-actuator
修改主机信息与访问路径显示IP
server:
port: 8001
eureka:
client:
register-with-eureka: true #是否要注册
fetchRegistry: true #是否抓取注册信息
service-url:
# defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001:7001/eureka,http://eureka7002:7002/eureka
instance: #修改主机名
instance-id: payment8001
prefer-ip-address: true #访问路径显示IP
spring:
application:
name : payment
datasource:
url: jdbc:mysql://localhost:3306/springboot-mybatisplus?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
username: root
password: 123456
driver-class-name=com: mysql.cj.jdbc.Driver
(7)discover服务发现
通过服务发现来获得服务信息
采坑6:https://www.cnblogs.com/liuhouhou/p/9026776.html
Controller接口
@Resource
private DiscoveryClient discoveryCilent;
@GetMapping("/get/discovery")
public Object discovery(){
return discoveryCilent;
}
主启动类:@EnableDiscoveryClient
@SpringBootApplication(scanbasePackages = "com.payment")
@EnableEurekaClient
@EnableDiscoveryClient
public class PaymentApplication {
public static void main(String[] args) {
SpringApplication.run(PaymentApplication.class, args);
}
}
执行结果:
(8)自我保护
如果某个注册服务无法使用,不会立即清理,依旧会保存该服务信息(CPA里的AP分支)。
关闭自我保护
server:
port: 7002
eureka:
instance:
hostname: eureka7002
client:
register-with-eureka: false #是否将自己注册到eureka中
fetch-registry: false #是否从eureka中获取信息
service-url:
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7001:7001/eureka
server:
enable-self-preservation: false #默认关闭安全机制
eviction-interval-timer-in-ms: 2000 #2秒不发送移除
2、ZooKeeper
zookeeper是一个分布式协调工具,可以实现注册中心功能,关闭防火墙后启动zookeeper服务器。
2.1 支付模块注册(payment8004)
pom.xml :Eureka依赖换位zookeeper
cloud2022 org.example 1.0-SNAPSHOT 4.0.0 payment8004 payment8004 org.springframework.cloud spring-cloud-starter-zookeeper-discovery 2.2.0.RELEASE com.commons commons 1.0-SNAPSHOT compile org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator com.baomidou mybatis-plus-boot-starter com.alibaba druid-spring-boot-starter 1.1.10 mysql mysql-connector-java org.springframework.boot spring-boot-starter-jdbc org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-devtools runtime true
application.yml
server:
port: 8004
#eureka:
# client:
# register-with-eureka: true #是否要注册
# fetchRegistry: true #是否抓取注册信息
# service-url:
## defaultZone: http://localhost:7001/eureka
# defaultZone: http://eureka7001:7001/eureka,http://eureka7002:7002/eureka
spring:
application:
name : payment8004
cloud:
zookeeper:
connect-string: 192.168.111.144:2181 #zookeeper地址
datasource:
url: jdbc:mysql://localhost:3306/springboot-mybatisplus?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
username: root
password: 123456
driver-class-name=com: mysql.cj.jdbc.Driver
#2、mybatis-plus配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config :
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
mapper-locations: classpath:mapper/*.xml
注启动类
@SpringBootApplication(scanbasePackages = "com.payment")
@EnableDiscoveryClient //激活
public class Payment4Application {
public static void main(String[] args) {
SpringApplication.run(Payment4Application.class, args);
}
}
其他业务层与Eureka相同;
Controller
@RestController
@RequestMapping("/payment8004")
@Slf4j
@RequiredArgsConstructor
public class PaymentController {
private final PaymentService paymentService ;
@Value("${server.port}")
public String serverPort;
@PostMapping("/save")
public Result saveEntity(@RequestBody Payment payment) {
paymentService.saveEntity(payment);
return new Result(200,"成功"+serverPort,"");
}
@GetMapping("/{id}")
public Result saveEntity(@PathVariable("id") Integer id) {
System.out.println(id);
return new Result(200,"成功"+serverPort,paymentService.getPayment(id));
}
}
zookeeper自带版本,如果与安装不一致,可能发生版本冲突,需要排除自身依赖,并引入与服务器一致的版本;
org.springframework.cloud spring-cloud-starter-zookeeper-discovery 2.2.0.RELEASE org.apache.zookeeper zookeeper org.apache.zookeeper zookeeper 3.4.9
服务节点是临时节点;
2.2 订单消费模块注册(consumer8004)
pom.xml与支付模块相同
cloud2022 org.example 1.0-SNAPSHOT 4.0.0 consumer8004 consumer8004 org.springframework.cloud spring-cloud-starter-zookeeper-discovery 2.2.0.RELEASE org.apache.zookeeper zookeeper org.apache.zookeeper zookeeper 3.4.9 com.commons commons 1.0-SNAPSHOT compile org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator com.baomidou mybatis-plus-boot-starter com.alibaba druid-spring-boot-starter 1.1.10 mysql mysql-connector-java org.springframework.boot spring-boot-starter-jdbc org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-devtools runtime true
application.yml更换server.port 和 application.name
server:
port: 8081
#eureka:
# client:
# register-with-eureka: true #是否要注册
# fetchRegistry: true #是否抓取注册信息
# service-url:
## defaultZone: http://localhost:7001/eureka
# defaultZone: http://eureka7001:7001/eureka,http://eureka7002:7002/eureka
spring:
application:
name : consumer81
cloud:
zookeeper:
connect-string: 192.168.111.144:2181 #zookeeper地址
datasource:
url: jdbc:mysql://localhost:3306/springboot-mybatisplus?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
username: root
password: 123456
driver-class-name=com: mysql.cj.jdbc.Driver
#2、mybatis-plus配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config :
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
mapper-locations: classpath:mapper/*.xml
配置restTemplate
@Configuration
public class ApplicationConfig {
@Bean
@LoadBalanced //开启负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
controller
@RestController
@RequestMapping("/consumer2")
@Slf4j
@RequiredArgsConstructor
public class PaymentController {
// public static final String payment_URL ="http://localhost:8001";
public static final String payment_URL ="http://PAYMENT";
private final RestTemplate restTemplate ;
@GetMapping("/get/save")
public Result saveEntity(Payment payment) {
return restTemplate.postForObject(payment_URL+"/payment8004/save",payment,Result.class);
}
@GetMapping("/{id}")
public Result getEntity(@PathVariable("id") Integer id) {
return restTemplate.getForObject(payment_URL+"/payment8004/"+id,Result.class);
}
3、Consul
3.1 简介
Go语言开发,提供了微服务的服务治理、配置中心、控制总线等一种完整的服务网格解决方案。基于raft协议,比较简介;支持健康检查;提供图形界面;跨平台,支持Linux、Mac、Windows等。
下载:https://www.consul.io/downloads
启动:consul agent -dev
访问:http://localhost:8500
3.2 注册服务提供者-支付模块pom.xml
org.springframework.cloud spring-cloud-starter-consul-discovery
application.yml
server:
port: 8006
spring:
application:
name : payment8006
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
*主启动类
@SpringBootApplication(scanbasePackages = "com.payment")
@EnableDiscoveryClient //激活
public class Payment6Application {
public static void main(String[] args) {
SpringApplication.run(Payment6Application.class, args);
}
}
目录:
启动访问:
3.3 注册服务消费者-订单模块
pom.xml 依赖与支付模块一致;application.yml与支付模块一致(除server.port与application.name外);restTemplate配置与zookeeper订单消费者模块一致;主启动类与zookeeper订单消费者模块一致;业务类需要跟换端口号与url(payment8006),与服务名一致;
总结:3个注册中心异同点
CAP:强一致性、可用性、分区容错性;关注粒度数据。
| Eureka | Java、AP、可配支持健康检查、http |
|---|---|
| Consul | Go、CP、支持健康检查、http |
| Zookeeper | Java、CP、支持健康检查、客户端 |



