zoukankan      html  css  js  c++  java
  • spring cloud深入学习(三)-----服务消费

    在上一篇博文中简单实现了eureka-server以及eureka-provider,后面会实现eureka-cosumer,现在针对eureka做进一步的详解。

    微服务整体架构

    文字再美也没有图片直观,下面通过一张图来说明微服务的整体架构以及调用过程,如下:

    服务注册中心-1和服务注册中心-2互相组成了高可用集群;
    服务提供者启动了两个实例,一个注册到服务注册中心-1上,另外一个注册到服务注册中心-2上;
    两个服务消费者,也都分别指向了一个注册中心。

    服务提供者

    1、服务注册

    服务提供者在启动的时候发送rest请求将自己注册到eureka-server上,包括自己的元数据,eureka-server会将相关数据存为两层map,第一层的key为服务名,第二层的key则为具体服务的实例名。

    2、服务同步

    两个服务提供者分别注册到了两个不同的服务注册中心上,并且这两个服务注册中心互相注册,因此当服务提供者发送注册请求到一个服务注册中心时,它会将该请求转发到集群中相连的其他注册中心,从而实现服务同步。

    3、服务续约

    当服务提供者注册到服务注册中心之后,服务提供者会维护一个心跳,需要定期的告诉注册中心,我是有效的,没有挂掉。否则不续约的话,注册中心就会将服务提供者干掉。

    # 定义服务续约任务的调用间隔时间,默认30秒
    eureka.instance.lease-renewal-interval-in-seconds=30
    # 定义服务失效的时间,默认90秒
    eureka.instance.lease-expiration-duration-in-seconds=90

    服务消费者

    在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。

    1、ribbon

    ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为。Feign默认集成了ribbon。

    2、新建一个eureka-consumer工程

    pom.xml文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.4.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.ty</groupId>
        <artifactId>eureka-consumer</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>eureka-consumer</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
                <version>2.1.1.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                <version>2.1.1.RELEASE</version>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Finchley.RELEASE</version>
                    <type>pom</type>
                </dependency>
    
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>

    运行主类:

    package com.ty.eurekaconsumer;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    //这里注意另外一个注解:@EnableDiscoveryClient,@EnableEurekaClient只能往eureka注册中心注册,而前者可以用于其他注册中心,例如consul @EnableEurekaClient @SpringBootApplication
    public class EurekaConsumerApplication { public static void main(String[] args) { SpringApplication.run(EurekaConsumerApplication.class, args); } }

    application.properties

    # 服务名称
    spring.application.name=eureka-consumer
    # 端口号
    server.port=3001
    # 服务注册中心地址
    eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

    controller:

    package com.ty.eurekaconsumer.controller;
    
    import com.ty.eurekaconsumer.service.RibbonService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class RibbonController {
    
        @Autowired
        RibbonService ribbonService;
    
        @GetMapping("/ribbonService")
        public String hi(@RequestParam String name) {
    
            return ribbonService.hiService( name );
        }
    }

    service:

    package com.ty.eurekaconsumer.service;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.client.RestTemplate;
    
    @Service
    public class RibbonService {
    
        @Autowired
        private RestTemplate restTemplate;
    
        public String hiService(String name) {
            return restTemplate.getForObject("http://eureka-provider/firstCall?name="+name, String.class);
        }
    }

    运行效果:

    浏览器中输入:http://localhost:3001/ribbonService?name=马云

    本人已将eureka-server、eureka-provider、eureka-consumer代码上传到github中地址如下

    eureka-server地址:https://github.com/ali-mayun/eureka-server

    eureka-provider地址: https://github.com/ali-mayun/eureka-provider

    eureka-consumer地址:https://github.com/ali-mayun/eureka-consumer 

    有需要的可以自行下载,另外方便的话,给个小星星哦!!!

  • 相关阅读:
    storm学习途径
    Spark中的RDD操作简介
    【转】Hadoop web页面的授权设定
    源码安装ipython,并在ipython中整合spark
    Spark调优
    在Java中调用C
    查看Mysql表空间大小 优化空间
    update A inner join
    kibana 汉化
    xcode-select --install不能下载该软件的解决办法
  • 原文地址:https://www.cnblogs.com/alimayun/p/10829067.html
Copyright © 2011-2022 走看看