栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringCloud - Eureka注册中心

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringCloud - Eureka注册中心

关键依赖

sprinboot

    org.springframework.boot
    spring-boot-starter-parent
    2.3.3.RELEASE
     

cloud

    
        org.springframework.cloud
        spring-cloud-dependencies
        Hoxton.SR5
        pom
        import
    

启动Eureka:
依赖:

这里我们要启用的是eureka服务端,也就是提供注册中心的,想要注册在eureka上的服务只需要把server改为client

    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-server

一给普通的springboot加上这个依赖并且在启动类上注解额外加上@EnableEurekaServer
这样他就是一个Eureka注册中心了
配置文件:

server:
  port: 8090

# eureka 配置
# eureka 一共有4部分 配置
# 1. dashboard:eureka的web控制台配置
# 2. server:eureka的服务端配置
# 3. client:eureka的客户端配置
# 4. instance:eureka的实例配置
eureka:
  instance:
    hostname: localhost # 主机名
  client:
    service-url:
      # eureka服务端地址,将来客户端使用该地址和eureka进行通信
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
	#这里本实例的身份是提供一个注册中心,所以不需要以下两个选项为true
    register-with-eureka: false # 是否将自己的路径 注册到eureka上。eureka server 不需要的,eureka provider client 需要
    fetch-registry: false # 是否需要从eureka中抓取路径。eureka server 不需要的,eureka consumer client 需要

启动以后浏览器直接访问Eureka所部署的端口就可以查看控制面板;

上面我们创造了一个Eureka服务端,注册发现中心


下面我们创建Eureka的客户端
无论是消费者还是生产者,在注册中心的注册模式都是一样的,注册在上面的可以是消费者也可以是生产者,所以他们的配置一样,注意服务名称,需要靠这个获取服务的url进行调用
依赖:

客户端依赖,在Eureka眼里除了他自己,所有服务都是客户端,所有服务都可以互相调用,谁都能是消费者和生产者

    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client

配置文件:

#此配置文件,消费者生产者一视同仁,反正就是往eureka注册就对了
server:
  port: 8088
  
eureka:
  instance:
    hostname: localhost # 主机名
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
spring:
  application:
  	# 名字注意区分,一种服务一个名字
    name: eureka-provider # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径

无视这个红字,稍后解释

到了这里我们已经完成了服务的注册,但是我们要怎么去调用服务呢
之前我们是使用手动输入url的方式进行调用的,现在我们通过注册中心,即时的拿到url进行调用
我们在消费者的启动类上添加注解

@EnableDiscoveryClient //激活DiscoveryClient,发现客户端
@EnableEurekaClient  //声明为Eureka的客户端
@SpringBootApplication  //不解释
public class ConsumerMain {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerMain.class,args);
    }
}

编码进行服务的调用
这里首先进行的是使用Spring封装的restTemplate发起http服务调用
和原来我们需要记住url不同这次我们通过eureka即时的获取生产者的地址进行服务调用;
discoveryClient.getInstances("eureka-provider")通过服务名称获取指定类型服务的地址集合[集群状态预备],然后通过控制集合中终端的选取来做到调用以及负载均衡

// Discover获取url集合的方式进行调用
@GetMapping("/DiscoverClientGetUser/{id}")
public ResponseEntity DiscoverClientGetUser(@PathVariable("id") String id) {
    log.info("请求参数:" + "[" + id + "]");
    List instances = discoveryClient.getInstances("eureka-provider");//这里输入我们服务提供者注册往Eureka时配置的服务名称,通过这个获取他的rul进行调用
    //获取到的就是该服务的所有url路由,为什么是集合呢。因为集群啊,没有集群用个吉尔的cloud;如果只有一个就是一个调用咯。看你怎么操作这个集合就怎么进行负载均衡了
    if (CollUtil.isEmpty(instances)) {
        // 集合没有数据,抛出服务异常
        throw new ServerMissException(4041, "没有服务被发现");
    }
    //根据集合长度随机获取一个服务提供者
    ServiceInstance instance = instances.get(new Random().nextInt(instances.size()));
    int port = instance.getPort();
    String host = instance.getHost();
    String uri = "/provider/getUser/"+id;
    //获取host和port组成url发起请求
    String url="http://"+host+":"+port+uri;
    User user = restTemplate.getForObject(url, User.class);
    return ok(Objects.requireNonNull(user));
}

在这里虽然已经能即时发现并调用了,但是我们还是要管理大量的uri,稍后我们会使用一种更优解,解决这个问题

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/314935.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号