Eureka和Ribbon整合

简述

  • 三大角色

    • Eureka Server:提供服务的注册与发现
    • Service Provider:服务生产方,将自身服务注册到Eureka中,从而使服务消费方能狗找到
    • Service Consumer:服务消费方,从Eureka中获取注册服务列表,从而找到消费服务

设计图:

​​​​​​​

 

整合的编码套路:

1、导入依赖

2、编写yml配置文件

3、在启动类上启动服务,@EnableXXX

4、编写配置类

一、注册中心

1、导入依赖

<!--导包~-->
<dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
    <!--导入Eureka Server依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
        <version>1.4.6.RELEASE</version>
    </dependency>
</dependencies>

2、编写yml配置文件

server:
  port: 7001
eureka:
  instance:
    a-s-g-name: localhost #可以写127.0.0.1
  client:
    register-with-eureka: false  # 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
    fetch-registry: false  # fetch-registry如果为false,则表示自己为注册中心,客户端的化为 ture
    service-url:
      defaultZone: http://${eureka.instance.a-s-g-name}:${server.port}/eureka/ #服务注册地址

3、在启动类上启动服务,@EnableXXX

@SpringBootApplication
@EnableEurekaServer //服务端的启动类,可以接受别人注册进来~
public class EurekaService_7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaService_7001.class,args);
    }
}

4、启动服务即可。

访问http://localhost:7001/ ,进入Eureka的管理界面

 现在还没有服务注册进来。

二、服务提供者provider

1、导入依赖

<!--Eureka依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>

2、编写yml配置文件

server:
  port: 8001

spring:
  application:
    name: spring-cloud-provider #设置服务名。

eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/ #注册中心的注册地址
    instance:
      instance-id: springcloud-provider-dept-8001 #修改Eureka上的默认描述信息


3、在启动类上启动服务,@EnableXXX

@SpringBootApplication
@EnableEurekaClient //开启Eureka客户端注解,在服务启动后自动向注册中心注册服务
@EnableDiscoveryClient //开启服务发现客户端的注解,可以用来获取一些配置的信息,得到具体的微服务
public class Provider_8001 {
    public static void main(String[] args) {
        SpringApplication.run(Provider_8001.class,args);
    }
}

4、编写一些Controller测试接口即可

5、启动服务

先启动EurekaService服务端,后启动Provider客户端,然后访问监控页http://localhost:7001/ 产看结果如图,

扩展: 【配置关于服务加载的监控信息】

1、添加pom依赖

<!--actuator完善监控信息-->
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、之后可以在yml文件中添加

info:
  app.name: haier
  company.name: 青岛海尔

3、之后再Eureka管理界面点击服务,会返回上面添加的数据信息【json格式】

扩展二、注册进去的微服务,获取一些消息(团队开发会用到)

Controller新增获取服务信息的方法

    @GetMapping("/discovery")
    public Object discovery(){
        // 获取微服务列表的清单
        List<String> services = client.getServices();
        System.out.println("获得client.getServices():"+services);

        // 得到一个具体的微服务信息,通过具体的微服务id,Eureka中的Application
        List<ServiceInstance> instances = client.getInstances("SPRING-CLOUD-PROVIDER");
        for (ServiceInstance instance : instances) {
            System.out.println("主机名称:"+instance.getHost());
            System.out.println("端口号:"+instance.getPort());
            System.out.println("URL:"+instance.getUri());
            System.out.println("服务id:"+instance.getServiceId());
        }
        return null;
    }

三、服务消费者Consummer【整合Ribbon】

1、导入依赖

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>

2、编写yml配置文件

server:
  port: 8080

eureka:
  client:
    register-with-eureka: false # 不向 Eureka注册自己
    service-url:
      defaultZone: http://localhost:7001/eureka/ #从Eureka获取服务地址

3、在启动类上启动服务,@EnableXXX

//Ribbon 和 Eureka 整合以后,客户端可以直接调用,不用关心IP地址和端口号
@EnableEurekaClient//开启Eureka 客户端
@SpringBootApplication
public class Consumer_8080 {
    public static void main(String[] args) {
        SpringApplication.run(Consumer_8080.class,args);
    }
}

4、编写配置类

@Configuration
public class ConfigBean {//@Configuration -- spring  applicationContext.xml

    /**
     * IRule:
     * RoundRobinRule 轮询策略
     * RandomRule 随机策略
     * AvailabilityFilteringRule : 会先过滤掉,跳闸,访问故障的服务~,对剩下的进行轮询~
     * RetryRule : 会先按照轮询获取服务~,如果服务获取失败,则会在指定的时间内进行,重试
     */

    @Bean
    @LoadBalanced //配置负载均衡实现RestTemplate
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    //默认轮询策略,这个Bean可以不要
    @Bean  
    public IRule myRule() {
        return new RandomRule();//使用随机策略
        //return new RoundRobinRule();//使用轮询策略
        //return new AvailabilityFilteringRule();//使用轮询策略
        //return new RetryRule();//使用轮询策略
    }
}

5、编写测试Controller,访问Eureke中心注册的Provider服务

@RestController
public class MyController {

    @Autowired
    private RestTemplate restTemplate;//我使用配置类注册Bean了,如果没有,直接new

    //Ribbon:我们这里的地址,应该是一个变量,通过服务名来访问
    //private static final String REST_URL_PREFIX = "http://localhost:8001";
    private static final String REST_URL_PREFIX = "http://SPRING-CLOUD-PROVIDER";

    @GetMapping("/getUser")
    public List<User> getUser(){
        System.out.println("getUser成功=========");
        return restTemplate.getForObject(REST_URL_PREFIX+"/user/getAllUser", List.class);
    }

}

启动后,直接访问这个接口即可。

【扩展】:可以自己配置Ribbon访问策略

文章参考:狂神说SpringCloud学习笔记_兴趣使然的草帽路飞-CSDN博客_狂神说springcloud


版权声明:本文为qq_44507798原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。