为什么要搭建注册中心集群 以防出现单点故障 也就是唯一那个注册中心出现故障 导致整个架构故障
互相注册 相互守望
先要修改本机的hosts文件的主机映射 增加映射 C:WindowsSystem32driversetchosts
1.修改之前7001配置文件
server:
port: 7001
eureka:
instance:
hostname: localhost #服务端的实例名称
client:
#false表示不向服务器注册自己
register-with-eureka: false
#false表示自己就是注册中心 去维护服务实例 不需要去检索服务
fetch-register: false
#设置与Enreka server交互的地址查询服务和注册服务都需要这个地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
2.修改之后 需要修改hostname 这个就是刚刚修改的本机的hosts主机映射 还需要修改服务地址
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #服务端的实例名称 主机别名 修改
client:
#false表示不向服务器注册自己
register-with-eureka: false
#false表示自己就是注册中心 去维护服务实例 不需要去检索服务
fetch-register: false
#设置与Enreka server交互的地址 查询服务和注册服务都需要这个地址 修改
service-url:
defaultZone: http://eureka7002.com:7002/eureka/
3.创建另一个注册中心7002 导入依赖不赘述了 7002的application.yml配置
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #服务端的实例名称 主机别名
client:
#false表示不向服务器注册自己
register-with-eureka: false
#false表示自己就是注册中心 去维护服务实例 不需要去检索服务
fetch-register: false
#设置与Enreka server交互的地址查询服务和注册服务都需要这个地址
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
4.启动7001 7002 配置成功
5.修改微服务提供者的配置client 其实只是增加了一个服务请求地址 defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka 集群版
8888消费者模块
server:
port: 8888
spring:
application:
name: cloud-order-service
eureka:
client:
register-with-eureka: true #自己注册到eureka 默认true
#是否从eureka抓取已有的注册信息 默认为true 单节点无所谓 集群必须为true 才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
#defaultZone: http://localhost:7001/eureka #注册中心地址
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
支付模块8001
server:
port: 8001
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/db2019?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
username: root
password: 1234
mybatis:
mapper-locations: classpath:mapper/*.xml #配置文件
type-aliases-package: com.lyx.cloud.entities #所有entity别名所在包
eureka:
client:
register-with-eureka: true #自己注册到eureka 默认true
#是否从eureka抓取已有的注册信息 默认为true 单节点无所谓 集群必须为true 才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
# defaultZone: http://localhost:7001/eureka #注册中心地址 单机版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
5.启动8888-消费者模块 8001-支付模块服务提供 成功注册
6.微服务提供者 集群搭建 再创建一个支付模块8002
server:
port: 8002
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/db2019?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
username: root
password: 1234
mybatis:
mapper-locations: classpath:mapper/*.xml #配置文件
type-aliases-package: com.lyx.cloud.entities #所有entity别名所在包
eureka:
client:
register-with-eureka: true #自己注册到eureka 默认true
#是否从eureka抓取已有的注册信息 默认为true 单节点无所谓 集群必须为true 才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
# defaultZone: http://localhost:7001/eureka #注册中心地址 单机版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
7.运行所有模块 注册成功
8.修改单机版的8888消费者的controller 让它不指定从服务端口
controller
@RestController
@Slf4j
public class OrderController {
@Autowired
private RestTemplate restTemplate;
//private static final String BASE_URL="http://localhost:8001"; 修改前的端口
private static final String BASE_URL="http://CLOUD-PAYMENT-SERVICE"; 修改后 变成在eureka注册的服务实例名称
@PostMapping("/comsumer/payment/create")
public CommonResult<PayMent> create(@RequestBody PayMent payMent){
return restTemplate.postForObject(BASE_URL+"/payment/create",payMent,CommonResult.class);
}
@GetMapping("/comsumer/payment/get/{id}")
public CommonResult<PayMent> getPaymentByid(@PathVariable("id") Long id){
return restTemplate.getForObject(BASE_URL+"/payment/get/"+id,CommonResult.class);
}
}
9.修改RestTemplate 配置 需要给它添加一个注解@LoadBalanced 赋予RestTemplate负载均衡能力 默认是轮询
是因为注册中心暴露了多个支付模块的服务名称CLOUD-PAYMENT-SERVICE 但是消费者模块不知道选哪个
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
10.测试 所以消费者模块只关注微服务名称