ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(六)、集群Eureka构建

2021-10-01 13:04:59  阅读:186  来源: 互联网

标签:服务 eureka instance 构建 集群 Eureka com 8001 cloud


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

标签:服务,eureka,instance,构建,集群,Eureka,com,8001,cloud
来源: https://www.cnblogs.com/cg-ww/p/15359162.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有