Loading

(六)、集群Eureka构建

EureKa集群说明

img

服务注册:将服务信息注册进注册中心

服务发现:从注册中心上获取服务信息

实质:存key服务命取value闭用地址

1先启动eureka注主册中心

2启动服务提供者payment支付服务

3支付服务启动后会把自身信息(比服务地址L以别名方式注朋进eureka

4消费者order服务在需要调用接口时,使用服务别名去注册中心获取实际的RPC远程调用地址

5消去者导调用地址后,底屋实际是利用HttpClient技术实现远程调用

6消费者实癸导服务地址后会缓存在本地jvm内存中,默认每间隔30秒更新—次服务调用地址

问题:微服务RPC远程服务调用最核心的是什么
高可用,试想你的注册中心只有一个only one,万一它出故障了,会导致整个为服务环境不可用。

Eureka集群环境构建

1.创建一个Module:cloud-eureka-server7002参考新建的7001

2.找到C:\Windows\System32\drivers\etc路径下的hosts文件,修改映射配置添加进hosts文件,为避免重名

127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com

3.修改cloud-eureka-server7001配置文件

server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #集群指向其它eureka
      defaultZone: http://eureka7002.com:7002/eureka/
      #单机就是7001自己
      #defaultZone: http://eureka7001.com:7001/eureka/

4.修改cloud-eureka-server7002配置文件

server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002.com #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #集群指向其它eureka
      defaultZone: http://eureka7001.com:7001/eureka/
      #单机就是7002自己
      #defaultZone: http://eureka7002.com:7002/eureka/

5.测试

相互注册,相互守望

访问Eureka (eureka7002.com),指向7001

访问Eureka (eureka7001.com),指向7002

image-20210911162133363

image-20210911162214193

订单支付两个微服务入驻Eureka集群

将支付服务8001微服务,订单服务80微服务发布到上面2台Eureka集群配置中

对两个工程的配置文件的eureka.client.service-url.defaultZone进行修改

eureka:
  client:
    #表示是否将自己注册进Eurekaserver默认为true。
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetchRegistry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka

测试

  1. 先要启动EurekaServer,7001/7002服务
  2. 再要启动服务提供者provider,8001
  3. 再要启动消费者,80
  4. 浏览器输入 - http://localhost/consumer/payment/get/1

支付微服务集群配置

支付服务提供者8001集群环境构建参考cloud-provicer-payment8001

1.新建cloud-provider-payment8002

2.配置pom

3.写YML

4.主启动类

5.业务类

6.修改8001/8002的Controller,添加serverPort

@RestController
@Slf4j
public class PaymentController{

    @Value("${server.port}")
    private String serverPort;//添加serverPort

    @PostMapping(value = "/payment/create")
    public CommonResult create(@RequestBody Payment payment)
    {
        int result = paymentService.create(payment);
        log.info("*****插入结果:" + result);

        if(result > 0) {
            return new CommonResult(200,"插入数据库成功,serverPort: "+serverPort/*添加到此处*/, result);
        }else{
            return new CommonResult(444,"插入数据库失败",null);
        }
    }
}

之前单机版写死了,一直就是8001端口的那个服务,现在两个服务,需要均衡分配

负载均衡

cloud-consumer-order80订单服务访问地址不能写死

@Slf4j
@RestController
public class OrderController {

    //public static final String PAYMENT_URL = "http://localhost:8001";
    public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
    
    ...
}

使用@LoadBalanced注解赋予RestTemplate负载均衡的能力

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
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced//使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

}

测试

先要启动EurekaServer,7001/7002服务

再要启动服务提供者provider,8001/8002服务

浏览器输入 - http://localhost/consumer/payment/get/31

结果:负载均衡效果达到,8001/8002端口交替出现

Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号,且该服务还有负载功能。

image-20210911181951194

访问:localhost/consumer/payment/get/1

image-20210911182011904

image-20210911182022103

负载均衡效果达到,8001、8002端口交替出现

注意:

Web server failed to start. Port 8002 was already in use.端口被占用

There was an unexpected error (type=Internal Server Error, status=500).
500 : [{"timestamp":"2021-09-11T10:06:45.594+0000","status":500,"error":"Internal Server Error","message":"Invalid bound statement (not found): com.ylc.cloud.dao.PaymentDao.getPaymentById","trace":"org.apach... (6468 bytes)]
org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 : [{"timestamp":"2021-09-11T10:06:45.594+0000","status":500,"error":"Internal Server Error","message":"Invalid bound statement (not found): com.ylc.cloud.dao.PaymentDao.getPaymentById","trace":"org.apach... (6468 bytes)]

Invalid bound statement (not found): com.ylc.cloud.dao.PaymentDao.getPaymentById,这个是mapper.xml里面的类,命名空间错误

Actuator微服务信息完善

主机名称的修改

修改cloud-provider-payment8001,cloud-provider-payment8002

服务名称的完善

修改部分 - YML - eureka.instance.instance-id

image-20210912145054013

image-20210912145029034

eureka主页将显示payment8001,payment8002代替原来显示的IP地址

访问信息有IP信息提示

就是将鼠标指针移至payment8001,payment8002名下,会有IP地址提示

修改部分 - YML - eureka.instance.prefer-ip-address

eureka:
  ...
  instance:
    instance-id: payment8001 
    prefer-ip-address: true #添加此处
eureka:
  ...
  instance:
    instance-id: payment8002 
    prefer-ip-address: true #添加此处    

image-20210912145511727

服务发现Discovery

对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息

  • 修改cloud-provider-payment8001的Controller
import org.springframework.cloud.client.discovery.DiscoveryClient;

@Resource
private DiscoveryClient discoveryClient;

@GetMapping(value = "/payment/discovery")
    public Object discovery()
    {
        List<String> services = discoveryClient.getServices();
        for (String element : services) {
            log.info("*****element: "+element);
        }

        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance : instances) {
            log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
        }

        return this.discoveryClient;
    }

主启动类增加注解

@EnableDiscoveryClient//添加该注解

自测
先要启动EurekaSeryer

再启动8001主启动类,需要稍等一会儿

浏览器输入http://localhost:8001/payment/discovery

浏览器输出:

{"services":["cloud-payment-service"],"order":0}

后台输出:

*****element: cloud-payment-service

image-20210912151347563

image-20210912151227985

posted @ 2021-10-01 12:33  炒焖煎糖板栗  阅读(84)  评论(0编辑  收藏  举报