Eurekad的使用

Eureka服务中心的创建

先看了这篇文章,才能继续往下写,有个前后关系

1.创建一个maven模块

注意模块的位置
在这里插入图片描述

2.编写pom.xml文件

导入依赖

    <dependencies>
		<!--主要依赖,注意是server端的包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <!--先clean,再install打包,然后在这引入,引入自己定义的通用的api包-->
            <groupId>com.tanzimo.com.tanzimo.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <!--            <version>1.0-SNAPSHOT</version>-->
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
3.编写application.yml文件
#设置Eureka服务中心的端口
server:
  port: 7001
eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  client:
    #false表示不向服务中心注册自己,因为自己就是服务中心
    register-with-eureka: false
    #false表示自己就是服务中心,我的职责就是维护服务实例,并不需要去检索服务
    fetch-registry: false
    service-url:
      #设置与eureka server交互的地址 查询服务和注册服务都需要依赖的这个地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4.编写主启动类
@SpringBootApplication
@EnableEurekaServer//这个注解表示自己是服务中心,由我来管理客户端的服务注册
public class EurekaMain7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7001.class, args);
    }
}

改写Client客户端微服务提供者

前面写的文章有编写过Client客户端微服务提供者,这里进行改写

1.改写pom.xml文件

导入依赖
注意这里是client端的依赖包,上面才是server端

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.改写application.yml文件

添加新配置

eureka:
  client:
    #表示将自己是否注册到eureka server,默认为true,这里也应该为true,因为自己是提供者肯定要注册进去,与eureka服务中心发生关系
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    serviceUrl:
      #入住地址,也就是注册到前面创建的那个服务中心里
      defaultZone: http://localhost:7001/eureka
3.改写主启动类

在主启动类上面添加一个注解就好了
@EnableEurekaClient:表示自己是客户端

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

这时你可以启动一下项目看有没有报错再继续往下写,否则一路写到底万一有错也很难改,其次,注意模块的启动顺序,先启动服务中心server,再启动客户端client,这里有个前后关系,先有了服务中心,你才能去注册嘛,否则会找不到地址而出问题。启动之后会访问
localhost:7001你会发现下面已经显示有个服务注册在里面了,这样就表示成功了

改写Client客户端微服务消费者

也是一样,前面写的文章有编写过Client客户端微服务消费者,这里进行改写

1.改写pom.xml文件

导入依赖

org.springframework.cloud spring-cloud-starter-netflix-eureka-client
2.改写application.yml依赖
eureka:
  client:
    #表示将自己是否注册到eureka server,默认为true,这里也应该为true,因为自己是提供者肯定要注册进去,与eureka发生关系
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    serviceUrl:
      #入住地址
      defaultZone: http://localhost:7001/eureka
spring:
  application:
    name: cloud-order-service
3.改写主启动类

主启动类添加注解@EnableEurekaClient

现在就可以启动测试一下了启动之后访问localhost:7001就会发现有两个服务注册成功了
注意,服务之间的通讯还是要靠RestTemplate来支持,目前EurekaServer只是负责来管理显示服务的运行情况,状态信息啥的,跟里面服务之间的通讯没关系就相当于Eureka只是个可视化工具,我的理解是这样

Eureka集群的搭建

1.改写hosts文件

C:\Windows\System32\drivers\etc此路径下的hosts文件
添加:(注意以管理员的方式打开,否则会因为权限不足不能修改,可以先设置打开记事本默认就是管理员打开,这样右键打开方式选择记事本就已经是管理员了)

127.0.0.1   eureka7001.com
127.0.0.1   eureka7001.com
2.再自己编写一个和7001一样的模块
3.编写两个服务中心的application.yml文件

7001的:

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

7002的:

server:
  port: 7002
eureka:
  instance:
    hostname: eureka7002.com #eureka服务端的实例名称
  client:
    #false表示不向注册中心注册自己
    register-with-eureka: false
    #false表示自己就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    fetch-registry: false
    service-url:
      #设置与eureka server交互的地址 查询服务和注册服务都需要依赖的这个地址
      #注意这里是7001,相互守望,相互注册
      defaultZone: http://eureka7001.com:7001/eureka/
4.改写提供者payment的application.yml文件

注册到两个服务中心,注意用逗号隔开
defaultZone: http://eureka7002.com:7002/eureka,http://eureka7001.com:7001/eureka/

4.改写消费者order的application.yml文件

注册到两个服务中心,注意用逗号隔开
defaultZone: http://eureka7002.com:7002/eureka,http://eureka7001.com:7001/eureka/

5.启动项目

注意一定要按顺序,先启动集群,再启动提供者,再启动消费者,不然提供者去找集群注册找不到会报错,url结尾要加/

6.开启负载均衡

@LoadBalanced//开启负载均衡
这样根据服务名称找提供者才不会迷路报错
controller:

public static final String PAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";
//注意这里不再是"http://localhost:8001",而是"http://CLOUD-PAYMENT-SERVICE",选择是根据服务去找名字
return restTemplate.getForObject(PAYMENT_URL+"/payment/query/"+id, CommonResult.class);
@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced//开启负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

这个时候80端口order去找payment的时候会根据服务名去找,而我们的payment服务名一样,就会随机选择,而实现负载均衡

actuator信息完善

eureka:
  instance:
    instance-id: payment8001 #设置暴露的服务名
    prefer-ip-address: true  #访问路径可以显示ip地址

discovery服务发现

1.在controller注入,这个东东包含很多信息
import org.springframework.cloud.client.discovery.DiscoveryClient;注意啊,导包别导错了,导错了里面的方法都不一样
这个是接口

@Resource
private DiscoveryClient discoveryClient;

2.使用DiscoveryClient


@GetMapping("/payment/discovery")
public Object getDiscovery(){
    EurekaClientConfig eurekaClientConfig = discoveryClient.getEurekaClientConfig();
    String serverPort = eurekaClientConfig.getEurekaServerPort();
    log.info("==============="+serverPort);
    List<InstanceInfo> instances = discoveryClient.getInstancesById("CLOUD-PAYMENT-SERVICE");
    for (InstanceInfo info : instances){
        log.info(info.getInstanceId()+"==="+info.getHostName()+"==="+info.getPort()+"==="+info.getHomePageUrl());
    }
    return this.discoveryClient;
}

3.在主启动类添加注解

@EnableDiscoveryClient,开启discovery服务发现

4.有集群相互注册就都要启动
5.为什么有时候有的服务中心没有显示完全注册的提供者或消费者?
因为你是先启动了提供者,他会进行注册,要是有一个地主,就注册进去一个,有两个就注册进去两个假如你先启动提者,在启动对应的集群,可能在有的集群还没启动完全,提供者就已经完成注册了,此时有的服务中心就会缺少提供者或消费者
有个先后关系的懂吗

关闭自我保护机制

自我保护机制:客户端不向服务端发送心跳了,不会立刻移除客户端,而是会先保留,等待多少多少秒之后再删除
server端:


  server:
    #关闭自我保护机制,默认开启true
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 2000 #2秒后就移除这个没心跳的客户端

client端:

    #Eureka客户端向服务端发送心跳的时间间隔,单位为秒,默认30秒,也就是每30秒发送一次心跳,出故障了就发送不了了
    lease-renewal-interval-in-seconds: 1 #1秒,发送的更频繁了
    #Eureka服务端收到最后一次心跳的等待上限时间,默认是90秒,也就是说,等你90秒,要是90秒还不给心跳,就剔除你这个客户端
    lease-expiration-duration-in-seconds: 2 #2秒,让你客户端死得更快

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子酷兒233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值