Spring cloud day(2) Eureka

一、服务注册中心

1.1 服务治理

在这里插入图片描述

1.2 服务注册与发现

在这里插入图片描述

1.3 Eureka 包含2个组件

在这里插入图片描述

1.4 eureka架构图

1.5 eureka server相关依赖

  • 新版本的eureka依赖
 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.1.2</version>
        </dependency>
  • 图像化界面
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

1.6 配置文件

server:
  port: 7001
eureka:
  instance:
    #eureka 服务端的实例名称

    hostname: localhost
  client:
    #false 表示不向注册中心注册自己
    register-with-eureka: false
    #表示自己段就是注册中心,我的职责就是维护服务实例,并不需要取检索服务
    fetch-registry: false
    service-url:
      #设与Eureka Server交互的地址插叙服务和注册服务都需要这个地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/


1.7 eureka server端主启动类

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

1.8 运行,访问7001

在这里插入图片描述

1.8 eureka client

  • 将服务加入eureka server

  • 加依赖

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

  • 改配置文件
eureka:
  client:
    register-with-eureka: true #是否向注册中心注册自己
    fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
    service-url:
      #      设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://localhost:7001/eureka #单机版,入住的是哪个主机的eureka
      # defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群版
  • 加注解@EnableEurekaClient
//主启动类
@SpringBootApplication
@EnableEurekaClient
public class paymentBook {
    public static void main(String[] args) {
        SpringApplication.run(paymentBook.class, args);
    }
}

1.9 先启动server,再启动client

在这里插入图片描述

1.10 client在eureka中的注册名称

  • 与spring.application.name对应

在这里插入图片描述

1.11 services consumer和service provider都可以入住eureka

  • 都作为eureka的client

二、eureka集群

2.1 架构图

在这里插入图片描述

2.2 修改hosts文件

  • 路径:C:\Windows\System32\drivers\etc
127.0.0.1 eureka7002.com

2.3 集群版的配置文件

  • defaultZone填写的是对方的eureka
server:
  port: 7001
eureka:
  instance:
    #eureka 服务端的实例名称

    hostname: eureka7001.com
  client:
    #false 表示不向注册中心注册自己
    register-with-eureka: false
    #表示自己段就是注册中心,我的职责就是维护服务实例,并不需要取检索服务
    fetch-registry: false
    service-url:
      #设与Eureka Server交互的地址插叙服务和注册服务都需要这个地址
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      #集群版是相互注册
      defaultZone: http://eureka7002.com:7001/eureka/

2.4 访问eureka

  • 7001指向7002,7002指向7001

在这里插入图片描述

2.5 client注册eureka集群

三、报错

3.1 yml文件层次和缩进不当都会报错

四、服务集群搭建

4.1 8001 controller输出服务器信息

  • @Value(“${server.port}”)
@RestController
public class PaymentController {
    @Resource
    PaymentService paymentService;
    //读取的是配置文件中的server.port
    @Value("${server.port}")
    private String serverport;
    //postmapping好多浏览器不支持
    @PostMapping("/addPayment")
    public CommenResult addPayment(@RequestBody String serial){
        Payment payment = new Payment(serial);
        int i = paymentService.create(payment);
        if(i > 0){
            return new CommenResult(200,serverport + "successcrycry",payment);
        }else {
            return new CommenResult(500,"error");
        }

    }
    @GetMapping("/getPayment")
    public CommenResult getPayment(@RequestParam("id")int id){
        Payment payment = paymentService.getPayment(id);
        if(payment != null){
            return new CommenResult(200,"succ", payment);
        }else {
            return new CommenResult(500,"error");
        }
    }
}

4.2 同样服务提供者在eureka显示

在这里插入图片描述

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

  • 服务消费者controller
@RestController
@Slf4j
public class OrderController {
    //public static final String PAYMENT_URL = "http://localhost:8081";
    public static final String PAYMENT_URL = "http://PAYMENT-SERVICES";
    @Resource
    private RestTemplate restTemplate;
    @PostMapping("/consumer/addPayment")
    public CommenResult<Payment> create(@RequestParam("serial")String serial){
        System.out.println(serial);
        return restTemplate.postForObject(PAYMENT_URL + "/addPayment", serial, CommenResult.class);
    }
    @GetMapping("/consumer/getPayment/{id}")
    public CommenResult<Payment> getPayment(@PathVariable("id") int id){
        return restTemplate.getForObject(PAYMENT_URL + "/getPayment?id=" + id, CommenResult.class);
    }
}

  • 服务消费者调用Eureka的服务名称
    在这里插入图片描述

4.4 当前存在的问题

同名的服务提供者有多个,远程调用时不知道到底调用哪一个,所以会报错

  • 解决方法
    @LoadBalanced

4.5 @LoadBalanced修改消费者config

  • LoadBalanced默认是轮询算法
@Configuration
public class ApplicationContext {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

4.6 点击eureka中的微服务,左下角显示ip

  • 相关配置
eureka:
   instance:
        instance-id: payment8001
        #点击微服务名称,左下角显示IP
        prefer-ip-address: true

4.7 服务发现(Controller类中)

  • 注入DiscoveryClient 实例
 @Resource
    DiscoveryClient discoveryClient;
  • 微服务信息接口
   @GetMapping("/getServiceInfo")

    public Object discovery(){
        List<String> services = discoveryClient.getServices();
        for(String str : services){
            System.out.println(str);
        }
        //根据微服务名称得到相关的微服务集
        List<ServiceInstance> instances = discoveryClient.getInstances("PAYMENT-SERVICES");
        for (ServiceInstance instance : instances){
            System.out.println(instance.getHost() + instance.getPort() + instance.getUri());
        }
        return this.discoveryClient;
    }
  • 主启动类配置@EnableDiscoveryClient
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class paymentBook {
    public static void main(String[] args) {
        SpringApplication.run(paymentBook.class, args);
    }
}

4.8 自我保护机制

在这里插入图片描述
在这里插入图片描述

4.9 关掉自我保护机制

  • eureka server端yml配置
eureka:
  server:
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 2000
  • 微服务8001配置yml
eureka:
  instance:
  #    Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-renewal-interval-in-seconds: 1
  #    Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
    lease-expiration-duration-in-seconds: 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值