SpringCloud之Eureka服务注册与发现(一)

一 Eureka的基本架构

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper)。

Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。

而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。SpringCloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

二 Eureka的三大角色

    

  • Eureka Server 提供服务注册和发现

  • Service Provider服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到

  • Service Consumer服务消费方从Eureka获取注册服务列表,从而能够消费服务

三 构建步骤

  • 创建eureka-server项目

    • pom.xml


     
     <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency><dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies><dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement><build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    registerWithEureka: 是否将自己注册到Eureka服务中,本身就是所有无需注册
    fetchRegistry : 是否从Eureka中获取注册信息
    serviceUrlEureka: 客户端与Eureka服务端进行交互的地址
    • yml

      server:
        port: 8761
      ​
      eureka:
        instance:
          hostname: localhost
        client:
          registerWithEureka: false
          fetchRegistry: false
          serviceUrl:
            defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    • 启动类

      @SpringBootApplication
      @EnableEurekaServer
      public class EurekaServerApplication {
      ​
          public static void main(String[] args) {
              SpringApplication.run(EurekaServerApplication.class, args);
          }
      ​
      }
    • 启动结果

  • 创建producer-service

    • pom.xml

       1   <dependencies>
       2         <dependency>
       3             <groupId>org.springframework.boot</groupId>
       4             <artifactId>spring-boot-starter-actuator</artifactId>
       5         </dependency>
       6         <dependency>
       7             <groupId>org.springframework.boot</groupId>
       8             <artifactId>spring-boot-starter-web</artifactId>
       9         </dependency>
      10         <dependency>
      11             <groupId>org.springframework.cloud</groupId>
      12             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      13         </dependency>
      14 15         <dependency>
      16             <groupId>org.springframework.boot</groupId>
      17             <artifactId>spring-boot-starter-test</artifactId>
      18             <scope>test</scope>
      19         </dependency>
      20     </dependencies>
      21 22     <dependencyManagement>
      23         <dependencies>
      24             <dependency>
      25                 <groupId>org.springframework.cloud</groupId>
      26                 <artifactId>spring-cloud-dependencies</artifactId>
      27                 <version>${spring-cloud.version}</version>
      28                 <type>pom</type>
      29                 <scope>import</scope>
      30             </dependency>
      31         </dependencies>
      32     </dependencyManagement>
      33     <!-- 微服务info内容详细信息 -->
      34     <build>
      35         <finalName>microservicecloud</finalName>
      36         <resources>
      37             <resource>
      38                 <directory>src/main/resources</directory>
      39                 <filtering>true</filtering>
      40             </resource>
      41         </resources>
      42         <plugins>
      43             <plugin>
      44                 <groupId>org.apache.maven.plugins</groupId>
      45                 <artifactId>maven-resources-plugin</artifactId>
      46                 <configuration>
      47                     <delimiters>
      48                         <delimit>$</delimit>
      49                     </delimiters>
      50                 </configuration>
      51             </plugin>
      52         </plugins>
      53     </build>
    • yml

      eureka:
        client:
          serviceUrl:
            defaultZone: http://localhost:8761/eureka/
        instance:         
          instance-id: product-service8080    #主机名称:服务名称修改
          prefer-ip-address: true   #访问路径可以显示IP地址
      ​
      server:
        port: 8080
      spring:
        application:
          name: product-service
      #微服务info内容详细信息
      info:
        app.name: product-service
        company.name: www.topcheer.com

       注info信息到最好还是访问的/actuator/info接口

启动类

@SpringBootApplication
#从Spring Cloud Edgware版本开始, @EnableDiscoveryClient @EnableEurekaClient
  • #省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上 public class ProducerServiceApplication { ​ public static void main(String[] args) { SpringApplication.run(ProducerServiceApplication.class, args); } ​ } ​

结果:

                    

Eureka中的元数据获取

/**
     * 参数:商品id
     *  通过订单系统,调用商品服务根据id查询商品信息
     *      1.需要配置商品对象
     *      2.需要调用商品服务
     *  使用java中的urlconnection,httpclient,okhttp
     */
    @RequestMapping(value = "/buy1/{id}",method = RequestMethod.GET)
    public Product findById1(@PathVariable Long id) {
        //调用discoveryClient方法
        //已调用服务名称获取所有的元数据
        List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
        //获取唯一的一个元数据
        ServiceInstance instance = instances.get(0);
        //根据元数据中的主机地址和端口号拼接请求微服务的URL
        Product product = null;
        //如何调用商品服务?
        product = restTemplate.getForObject("http://service-product/product/1",Product.class);
        return product;
    }

原文地址:https://www.cnblogs.com/dalianpai/p/11687145.html