Spring Cloud—四、Spring Cloud快速入门

4.1、分析硬编码的问题

通过前面3.4的实现,我们似乎已经解决了url硬编码的问题,但是我们想想: 1、如果商品微服务的ip地址发生了变更,订单微服务中的配置文件也需要跟着修改 2、如果商品微服务有多个,那么在订单微服务中又该如何写地址? 那应该怎么解决呢? - 通过服务注册、发现的机制来完成。

4.2、微服务注册与发现

原理示意图: 原理示意图.png

由上图可以看出: 1.服务提供者将服务注册到注册中心。 2.服务消费者通过注册中心查找服务。 3.差找到服务后进行调用(这里就是无需硬编码url的解决方案) 4.服务的消费者与服务注册中心保持心跳连接,一旦服务提供者的地址发生变更时,注册中心会通知服务消费者。

4.3、注册中心Eureka

Spring Cloud提供了多种注册中心的支持,如:Eureka、Zookeeper等。推荐使用Eureka。 Eureka.png

4.3.1、原理

原理.png Eureka包含两个组件:Eureka Server和Eureka Client。

Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

Eureka Client是一个JAVA客户端,用于简化与Eureka Server的交互,客户端同时也就别一个内置的、使用轮询(round-robin)负载算法的负载均衡器。

在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。

Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

4.3.2、编写Eureka Server

第一步,创建工程springcloud-demo-eureka:(同3.1.1) 第二步,导入依赖:这里需要导入Spring Cloud的管理依赖。

<!-- 导入Spring Cloud的依赖管理 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- 导入Eureka服务 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

第三步,声明这是一个Eureka服务![声明.png](https://upload- images.jianshu.io/upload_images/9205543-5a2cd624d0353983.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 第四步,编写application.properties配置文件: application.properties.png 第五步,启动程序做测试 测试结果.png

4.3.3、将商品微服务注册到Eureka

接下来,我们需要将商品的微服务注册到Eureka服务中。 第一步,修改pom文件,引入Spring Cloud的管理依赖以及eureka服务依赖。

<!-- 导入Spring Cloud的依赖管理 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- 导入Eureka服务 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

第二步,修改application.properties配置文件
application.properties.png 第三步,启动类中,增加@EnableDiscoveryClient注解: EnableDiscoveryClient.png 第四步,启动测试: 结果.png

至此,我们以及将自己的微服务注册到Eureka Server中了。

4.3.4、订单系统从Eureka发现服务

之前我们在订单系统中是将商品微服务的地址进行了硬编码,现在,由于已经将商品服务注册到Eureka中,所以,只需要从Eureka中发现服务即可。

第一步,在订单系统中添加依赖(同4.3.3第一步) 第二步,修改application.properties配置文件
application.properties.png 第三步,修改ItemServie的实现逻辑:

public Item queryItemById(Long id) {
    String sericeId = "springcloud-demo-item";
    // 获取一个实例
    List<ServiceInstance> instances = this.discoveryClient.getInstances(sericeId);
    if (instances.isEmpty()) {return null;}
        ServiceInstance instance = instances.get(0);

    String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/item/query/" + id;
    return this.restTemplate.getForObject(url,Item.class);
}

第四步,在启动类中添加@EnableDiscoveryClient注解 EnableDiscoveryClient.png 第五步,启动测试 我们发现返回结构是xml,这是由于我们引入了eureka server的依赖,导致破坏了之前Sring Mvc默得配置,从而导致了响应成了xml。

解决方法:排除eureka server中的xml依赖,如下:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
    <exclusions>
    <exclusion>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        </exclusion>
    </exclusions>
</dependency>

测试结果: 结果.png


出自:zuoqy博客 如若转载请注明出处!