美文网首页『互联网架构』码农的世界
『互联网架构』软件架构-Eureka使用(92)

『互联网架构』软件架构-Eureka使用(92)

作者: IT人故事会 | 来源:发表于2019-06-14 21:01 被阅读0次

    原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
    原文链接地址:『互联网架构』软件架构-Eureka使用(92)

    上次说了单体架构和微服务之前优缺点的对比,也说了zookeeper和Eureka理论上的区别,也说了Eureka高水平的架构。Eureka Server 和Eureka Client也就是消费者和生产者的的关系。 源码:https://github.com/limingios/netFuture/tree/master/源码/『互联网架构』软件架构-Eureka使用(92)/

    (一)Eureka分区的概念

    用户量比较大或者用户地理位置分布范围很广的项目,一般都会有多个机房。这个时候如果上线springCloud服务的话,我们希望一个机房内的服务优先调用同一个机房内的服务,当同一个机房的服务不可用的时候,再去调用其它机房的服务,以达到减少延时的作用。

    eureka提供了region和zone两个概念来进行分区,这两个概念均来自于亚马逊的AWS:

    • region

    可以简单理解为地理上的分区,比如亚洲地区,或者华北地区,再或者北京等等,没有具体大小的限制。根据项目具体的情况,可以自行合理划分region。

    • zone

    可以简单理解为region内的具体机房,比如说region划分为北京,然后北京有两个机房,就可以在此region之下划分出zone1,zone2两个zone。

    (三)Eureka简单搭建

    • EurekaServer

    pom 配置,加入spring cloud父POM及spring-cloud-starter-eureka-server。

    <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>
    
        <groupId>com.tuling.springcloud</groupId>
        <artifactId>04-eureka-server</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>04-eureka-server</name>
        <url>http://maven.apache.org</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.10.RELEASE</version>
        </parent>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Edgware.SR3</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- eureka server -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
            </dependency>
            <!-- 安全模块 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    
    

    application.properties

    server.port=8761
    #取消向eureka server(注册中心)注册
    eureka.client.register-with-eureka=false
    #取消向eureka server(注册中心)获取注册信息
    eureka.client.fetch-registry=false
    #eureka 提供服务发现的地址
    eureka.client.service-url.defaultZone=http://idig8:777@localhost:8761/eureka
    #eureka.client.service-url.defaultZone=http://localhost:8761/eureka
    # 安全模块
    security.basic.enabled=true
    security.user.name=idig8
    security.user.password=777
    
    • 启动类

    pom.xml

    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerStart {
    
        public static void main(String[] args) throws Exception {
            SpringApplication.run(EurekaServerStart.class, args);
        }
    }
    
    • order端
    <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>
    
        <groupId>com.tuling.springcloud</groupId>
        <artifactId>04-microservice-order</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>04-microservice-order</name>
        <url>http://maven.apache.org</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.10.RELEASE</version>
        </parent>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Edgware.SR3</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
        
        <dependencies>
            <!-- eureka -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <!-- 监控和管理生产环境模块 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!-- Spring WEB -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- Test -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- 集成Mybatis -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.1.1</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    
    

    application.properties

    spring.application.name=microservice-order
    server.port=8082
    ## db config
    spring.datasource.url=jdbc:mysql://localhost:3306/springcloud
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    
    ## log
    logging.level.root=INFO
    logging.level.org.springframework.web=DEBUG
    logging.level.com.tuling.springcloud=DEBUG
    
    #eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
    eureka.client.serviceUrl.defaultZone=http://zhangfei:777@localhost:8761/eureka
    eureka.instance.prefer-ip-address=true
    eureka.instance.instance-id=${spring.application.name}:${spring.application.instance_id:${server.port}}
    

    controller

    package com.tuling.springcloud.api;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    @RequestMapping("/order")
    public class OrderController {
        private final Logger logger = LoggerFactory.getLogger(OrderController.class);
        
        @Autowired
        private RestTemplate restTemplate;
        
        //http://localhost:8082/order/user/getById?userId=1
        @RequestMapping("/user/getById")
        public Object getUserById(String userId) {
            String url = "http://localhost:8081/user/getById?id=" + userId;
            logger.debug("param userId : {}, request url : {}", userId, url);
            Object result = restTemplate.getForEntity(url, Object.class);
            return result;
        }
        
        @RequestMapping("/user/getByIdEureka")
        public Object getUserByIdEureka(String userId) {
            String url = "http://microservice-user/user/getById?id=" + userId;
            Object result = restTemplate.getForEntity(url, Object.class);
            return result;
        }
        
        
    }
    

    启动类

    package com.tuling.springcloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class OrderMicroStart {
    
        public static void main(String[] args) throws Exception {
            SpringApplication.run(OrderMicroStart.class, args);
        }
    }
    
    

    (三)Eureka重要概念

    按照这个思路去观看源码

    • Register 服务注册
    • Renew 服务的续期
    • Fetch Registers : 获取注册列表信息
    • Eviction 服务剔除
    • Cancel: 服务下线

    PS:eureka在springcloud中充当服务注册功能,相当于dubbo+zk里面得zk,但是比zk要简单得多,zk可以做得东西太多了,包括分布式锁,分布式队列都是基于zk里面得四种节点加watch机制通过长连接来实现得,但是eureka不一样,eureka是基于HTTPrest来实现的,就是把服务的信息放到一个ConcurrentHashMap中,然后服务启动的时候去读取这个map,来把所有服务关联起来,然后服务器之间调用的时候通过信息,进行http调用。eureka包括两部分,一部分就是服务提供者(对于eureka来说就是客户端),一部分是服务端,客户端需要每个读取每个服务的信息,然后注册到服务端,很明显了,这个服务端就是接受客户端提供的自身的一些信息。

    相关文章

      网友评论

        本文标题:『互联网架构』软件架构-Eureka使用(92)

        本文链接:https://www.haomeiwen.com/subject/hdurfctx.html