Eureka学习

Eureka学习Eureka学习服务治理概念在传统的RPC远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要服务治理,管理服务与服务之间的依赖关系,可以实现服务调用、负载均衡、容错登,实现服务发现与注册!##Eureka的两个组件EurekaServerEurekaServ

大家好,欢迎来到IT知识分享网。

Eureka学习

服务治理概念

在传统的RPC远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要服务治理,管理服务与服务之间的依赖关系,可以实现服务调用、负载均衡、容错登,实现服务发现与注册!

Eureka的两个组件

Eureka Server

Eureka Server提供服务注册服务,各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可在界面中直观看到

Eruka Client

​ Eureka Client通过注册中心进行访问,他是一个java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器,在应用启动后,将会向Eureka Server发送心跳(默认周期30秒),如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)

Eureka运行原理

  1. 启动Eureka注册中心
  2. 启动服务提供者注册服务,会把自身的基本信息进行注册(服务名称会以配置文件中的spring.application.name注册)
  3. 启动消费者进行服务调用(使用服务别名去注册中心获取实际的RPC远程调用地址)
  4. 拿到远程调用地址后,底层通过HttpClient技术实现远程调用
  5. 消费者获得服务地址后会缓存在本地JVM中,默认每间隔30秒更新一次服务调用地址

Eureka Server实战配置

单机版环境搭建

服务端搭建

依赖添加

<!--Eureka Server依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

yml配置

server:
  port: 7001

eureka:
  instance:
    hostname: 127.0.0.1 #eruka服务端实例的名称
  client:
    #false表示不向注册中心注册自己
    register-with-eureka: false
    #false表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    fetch-registry: false
    service-url:
      #设置Eureka Server交互的地址查询,服务查询和服务注册都需要依赖这个地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
 	

启动访问

1、主启动类添加@EnableEurekaServer标识为Eureka Server端

2、启动成功后访问:http://127.0.0.1:7001/ 出现管理页面

注册服务者搭建(客户端)

依赖添加

<!--Eureka Client依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

配置yml

eureka:
  client:
    #true表示向注册中心注册服务
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      #设置Eureka Server交互的地址查询,服务查询和服务注册都需要依赖这个地址
      defaultZone: http://127.0.0.1:7001/eureka/
  instance:
    instance-id: payment8001        # 设置status中的名字
    prefer-ip-address: true        # 设置显示IP地址

启动测试

1、启动类添加注解@EnableEurekaClient

2、访问http://127.0.0.1:7001/ 到注册中心管理页面查看是否注册成功

3、注册成功后Instances currently registered with Eureka下:Application列会显示对应的服务名称

集群环境搭建

服务端搭建

修改映射配置host文件

C:\Windows\System32\drivers\etc  hosts
#添加如下配置
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com

互相注册、相互守望

eureka7001.com配置

server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com #eruka服务端实例的名称
  client:
    #false表示不向注册中心注册自己
    register-with-eureka: false
    #false表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    fetch-registry: false
    service-url:
      #设置Eureka Server交互的地址查询,服务查询和服务注册都需要依赖这个地址
      defaultZone: http://eureka7002.com:7002/eureka/

eureka7002.com配置

server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002.com #eruka服务端实例的名称
  client:
    #false表示不向注册中心注册自己
    register-with-eureka: false
    #false表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    fetch-registry: false
    service-url:
      #设置Eureka Server交互的地址查询,服务查询和服务注册都需要依赖这个地址
      defaultZone: http://eureka7001.com:7001/eureka/

启动后分别访问:http://eureka7002.com:7002/ ==== http://eureka7002.com:7001/

可以看到页面有DS Replicas标记为双方互为副本,相互注册,互相守望

注册服务者搭建(客户端)

注:基本和单节点配置一样,只需要关注service-url注册服务时,多个eureka已逗号隔开

server:
  port: 80

spring:
  application:
    name: order-service

eureka:
  client:
    #true表示向注册中心注册服务
    register-with-eureka: true
    fetch-registry: true
    service-url:
      #设置Eureka Server交互的地址查询,服务查询和服务注册都需要依赖这个地址
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  instance:
    instance-id: payment8001        # 设置status中的名字
    prefer-ip-address: true        # 设置显示IP地址

服务提供者集群消费者调用

服务提供者集群

实现:功能一模一样,端口不一致

yml配置文件

server:
  port: 8002

spring:
  application:
    name: payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mz-cloud-study?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: lwp123hh_QQ

# MyBatis配置
mybatis-plus:
  # 搜索指定包别名
  #    typeAliasesPackage: com.lwp.**.domain
  # 配置mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # 加载全局的配置文件
#  configLocation: classpath:mybatis/mybatis-config.xml

#代码生成
generator:
  packagePath: com.lwp
  entityPackName: entity
  servicePackName: service
  controllerPackName: controller
  modulePath: provider-payment001

eureka:
  client:
    #true表示向注册中心注册服务
    register-with-eureka: true
    fetch-registry: true
    service-url:
      #设置Eureka Server交互的地址查询,服务查询和服务注册都需要依赖这个地址
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  instance:
    instance-id: payment8002        # 设置status中的名字
    prefer-ip-address: true        # 设置显示IP地址

devtools:
  restart:
    enabled: true #是否支持热部署

不同点:server.port、eureka.instance.instance-id

代码区分具体服务提供者

//配置文件获取端口
@Value("${server.port}")
private String port;

@GetMapping("/list")
public AjaxResult list(){
    return AjaxResult.success("当前提供服务端口为:"+port,paymentService.list());
}

消费者测试

RestTemplate开启负载均衡

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced //开启负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

请求服务提供者原固定地址修改为Eureka的服务名称

@Autowired
private RestTemplate restTemplate;
//原写死地址
//    private String PAYMENT_URL = "http://127.0.0.1:8001/payment/";

//通过服务名称指定-->PAYMENT-SERVICE为Eureka中注册的服务名称
private String PAYMENT_URL = "http://PAYMENT-SERVICE/payment/";

@GetMapping("/list")
public AjaxResult list(){
    ResponseEntity<AjaxResult> forEntity =
        restTemplate.getForEntity(PAYMENT_URL + "list", AjaxResult.class);
    return forEntity.getBody();
}

测试访问

输入:http://127.0.0.1/order/list 通过接口可以看出来,使用的负载轮询策略进行访问服务提供者的服务,结果如下:

{
    "msg": "当前提供服务端口为:8002", //随着轮询策略变化
    "code": 200,
    "data": [
        {
        "id": "111",
        "serial": "1234245345"
        },
        {
        "id": "1421824275765010433",
        "serial": "溪风测试"
        }
    ]
}

Discovery服务发现

代码实现

1、启动类添加@EnableDiscoveryClient注解生效

2、使用DiscoveryClient获取相关信息,

注意:有两个包,一定要注意引入下面路径的包

import org.springframework.cloud.client.discovery.DiscoveryClient;
//获取服务基本信息的操作对象
@Autowired
private DiscoveryClient discoveryClient;

/**
     * 获取所有的服务名称,并通过下标获取具体服务的详细信息
     * @param index
     * @return
     */
@GetMapping("/getDiscoveryInfo/{index}")
public AjaxResult getDiscoveryInfo(@PathVariable  Integer index){
    Map<String,Object> map = new HashMap<>();
    //获取所有注册的实例
    List<String> services = discoveryClient.getServices();
    if(index>=services.size()){
        return AjaxResult.error("没有该服务的注册信息");
    }
    for (int i = 0; i < services.size(); i++) {
        map.put("ServiceName"+i,services.get(i));
    }

    //获取一个服务下的所有实例,比如集群多节点实例
    List<ServiceInstance> serviceName0 = discoveryClient.getInstances(map.get("ServiceName"+index).toString());
    List<Map<String,Object>> list = new ArrayList<>();
    serviceName0.forEach( instance -> {
        Map<String,Object> instanceMap = new HashMap<>();
        instanceMap.put("instanceId",instance.getInstanceId());
        instanceMap.put("host",instance.getHost());
        instanceMap.put("port",instance.getPort());
        instanceMap.put("uri",instance.getUri());
        instanceMap.put("serviceId",instance.getServiceId());
        instanceMap.put("scheme",instance.getScheme());
        instanceMap.put("metadata",instance.getMetadata());
        list.add(instanceMap);
    });
    map.put(map.get("ServiceName"+index)+"Info",list);
    return AjaxResult.success(map);
}

测试效果

输入存在的下标,得出结果

{
    "msg":"操作成功",
    "code":200,
    "data":{
        "ServiceName1":"order-service",
        "ServiceName0":"payment-service",
        "payment-serviceInfo":[
            {
                "metadata":{
                    "management.port":"8001"
                },
                "instanceId":"payment8001",
                "scheme":"http",
                "port":8001,
                "host":"169.254.118.211",
                "serviceId":"PAYMENT-SERVICE",
                "uri":"http://169.254.118.211:8001"
            },
            {
                "metadata":{
                    "management.port":"8002"
                },
                "instanceId":"payment8002",
                "scheme":"http",
                "port":8002,
                "host":"169.254.118.211",
                "serviceId":"PAYMENT-SERVICE",
                "uri":"http://169.254.118.211:8002"
            }
        ]
    }
}

输入不存在的下标,得出以下结果

{
    "msg":"没有该服务的注册信息",
    "code":200
}

Eureka自我保护

故障现象

说明:某时刻某个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存

设计思想:属于CAP理论中的AP分支

禁用自我保护

Eureka Server配置

eureka:
  server:
    #关闭自我保护机制,保证服务不可用及时被剔除,true为开启
    enable-self-preservation: false
    #逐出间隔计时器(毫秒),间隔多久剔除没有心跳响应的服务
    eviction-interval-timer-in-ms: 15000

Eureka Client配置

eureka:
  instance:
    instance-id: order80        # 设置status中的名字
    prefer-ip-address: true        # 设置显示IP地址
    #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认30秒)
    lease-renewal-interval-in-seconds: 5
    #Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认90秒),超时将被剔除
    lease-expiration-duration-in-seconds: 10

学习代码demo

Eureka服务端

​ eureka-server

​ eureka-server-7002

Eureka客户端(注册服务者)

​ provider-payment001==》服务提供

​ provider-payment-8002==》服务提供

​ mz-order==》服务调用

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30694.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信