beizili

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Eureka注册中心

最近在学习springcloud,接触到了Eureka,在这跟大家分享下。

一、需求分析:

在微服务中有众多的服务,那微服务的信息如何管理?Spring Cloud中提供服务注册中心来管理微服务信息。

首先说下我对Eureka的理解。微服务其实就像是我们的经常逛的万达一样,里面入驻了各式各样的商家,给我们提供了各种各样的服务,但是这些商家需要有个管理中心,来管理这些商家的入驻,而Eureka就是充当这样的角色。

为什么 要用注册中心?

1、微服务数量众多,要进行远程调用就需要知道服务端的ip地址和端口,注册中心帮助我们管理这些服务的ip和端口。

2、微服务会实时上报自己的状态,注册中心统一管理这些微服务的状态,将存在问题的服务踢出服务列表,客户端获取到可用的服务进行调用。

二、Eureka原理

EureKa采用C-S的设计架构,即包括了Eureka Server(服务端),EureKa client(客户端)。
1.EureKa Server 提供服务注册,各个节点启动后,在EureKa server中进行注册;

2 EureKa Client 是一个Java客户端,用于和服务端进行交互,同时客户端也是一个内置的默认使用轮询负载均衡算法的负载均衡器。在应用启动后,会向Eueka Server发送心跳(默认30秒)。如果EUR额卡 Server在多个心跳周期内没有接受到某个节点的心跳,EureKa Server将会从服务注册表中将这个服务移出(默认90秒)。

三、Eureka实战

1.导入相依的依赖

服务端:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

客户端:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2.配置application.yml文件

服务端:

server:
  port: 7001

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

客户端:

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service #服务名称

  datasource:
    type: com.alibaba.druid.pool.DruidDataSource  #当前数据源操作类型
    driver-class-name: org.gjt.mm.mysql.Driver    #mysql驱动包
    url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: 123456

eureka:
  client:
    #表示是否将自己注册进EurekaServer默认为true。
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      #            defaultZone: http://localhost:7001/eureka/   #单机版
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
  instance:
    instance-id: payment8001
    prefer-ip-address: true #访问路径可以显示ip地址

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.liwai.springcloud.entities  #所有entity别名所在包

注意:为了提高服务的容灾能力,避免单点故障,一般会为Eureka注册集群服务

3.加上注解

服务端:@EnableEurekaServer

package com.liwai.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @author syp
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7001.class, args);
    }
}

客户端:@EnableEurekaClient

package com.liwai.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @author syp
 */
@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8001.class, args);
    }
}

4.调用

package com.liwai.springcloud.controller;

import com.liwai.springcloud.entities.CommonResult;
import com.liwai.springcloud.entities.Payment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * @author syp
 */
@RestController
@Slf4j
public class OrderController {

    //    public static final String PAYMENT_URL = "http://localhost:8001"; //单机版
    public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/consumer/payment/create")
    public CommonResult<Payment> create(Payment payment) {
        return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
    }

    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
        return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
    }
}

需要获取详细代码,可以到我的git仓库下载:

https://gitee.com/BTYY/spring-cloud-study

参考文章:

1.https://blog.csdn.net/ycd500756/article/details/80955485

2.https://www.jianshu.com/p/e2e3ded1f54a

更多内容请关注微信公众号“外里科技
在这里插入图片描述

在这里插入图片描述

posted on 2020-05-18 00:32  被子里  阅读(12)  评论(0)    收藏  举报  来源