SpringCloud之Eureka2.0服务注册中心


1 了解相关概念

1.1 微服务架构如何拆分

  1. 微服务架构把每一个职责单一功能存放在独立的服务中
  2. 每个服务运行在单独的进程中
  3. 每个服务有自己独立数据库存储、实际上有自己独立的缓存、数据库、消息队列等

1.2 微服务架构与SOA架构区别

  1. 微服务架构基于SOA架构演变过来,继承SOA架构优点,在微服务架构中去除SOA架构中的ESB消息总线,采用http+json(restful)进行传输。
  2. 微服务架构比SOA架构粒度会更加精细,让专业的人去做专业的事。
  3. SOA架构中可能数据存储会发生共享,微服务架构强调每个服务都是单独的数据库,保证每个服务与服务之间互不影响。

1.3 一线简单的概念

1.3.1 服务治理

服务治理: 阿里巴巴开源的Dubbo和当当网在基础上扩展的Dubbox,Eureka,Apache的Consul等

1.3.2 服务注册与发现

RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)

  1. 服务注册与服务发现原理,在任何的RPC远程调用框架中,都会有一个注册中心。
  2. 注册中心的概念:存放服务地址相关信息(接口地址)
  3. SpringCloud中支持一下三种注册中心

    Eureka  
    Consul(go语言编写)  
    Zookerper  
    注意:Dubbo支持两种Redis和Zookeeper    
  1. springcloud组件架构图



2 SpringCloud支持的三种注册中心详解

2.1 Eureka注册中心环境搭建

2.1.1 配置基于单集群的环境

1. 配置pom文件

          <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.2.RELEASE</version>
          </parent>
          <groupId>com.fyzn12</groupId>
          <artifactId>springcloud-study-server</artifactId>
          <version>1.0-SNAPSHOT</version>
          <packaging>jar</packaging>

          <name>springcloud-study-server Maven Webapp</name>
          <!-- FIXME change it to the project's website -->
          <url>http://www.example.com</url>

          <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>1.7</maven.compiler.source>
            <maven.compiler.target>1.7</maven.compiler.target>
            <java.version>1.8</java.version>
          </properties>

          <dependencyManagement>
            <dependencies>
              <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR2</version>
                <type>pom</type>
                <scope>import</scope>
              </dependency>
            </dependencies>
          </dependencyManagement>

          <dependencies>
            <!-- 导入springboot的启动器-->
            <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- 导入springcloud的启动器-->
            <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>

            <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.12</version>
            </dependency>

          </dependencies>  
注意:SpringCloud与SpringBoot版本具有适配版本适配路径
如上图打开版本适配链接,会开到如图所示的界面,往下面滑动会考到如图所示

2. 添加application.properties文件

            # 项目的端口号
            server.port=8100
            # 服务的注册中心ip
            eureka.instance.hostname=127.0.0.1
            # 当前服务注册到eureka服务地址
            eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
            # 是否需要将服务注册到eureka注册中心上面,这里本身就是注册中心不需要(但是集群的时候需要为true)
            eureka.client.register-with-eureka=false
            # 是否需要检索服务
            eureka.client.fetch-registry=false
            # 运行出bug可添加
            spring.main.allow-bean-definition-overriding=true  

3. 编写注册中心服务的启动类

        /**
         * @author fyzn12
         * @version 1.0
         * @date 2020/7/20 18:55
         * @EnableEurekaServer:开启注册服务
         * @description:TODO
         */


        @SpringBootApplication
        @EnableEurekaServer
        public class AppEureka {
            public static void main(String[] args) {
                SpringApplication.run(AppEureka.class,args);
            }
        } 

4.编写会员服务项目

  1. 配置会员服务项目的pom文件(同上面pom文件配置,需要修改springcloud-study-server即可)
  2. 添加application.properties文件

        # 项目的端口号
        server.port=8000
        # 服务别名--服务注册到注册中心的名称
        spring.application.name=app-test-member
        # 当前服务注册到eureka服务地址,8100是注册中心服务端端口号
        eureka.client.service-url.defaultZone=http://localhost:8100/eureka
        # 需要将服务注册到eureka上面
        eureka.client.register-with-eureka=true
        # 是否需要检索服务
        eureka.client.fetch-registry=true  
  3. 编写会员服务启动类

    /**
     * @author fyzn12
     * @version 1.0
     * @date 2020/7/20 21:34
     * @description:TODO
     */
    @SpringBootApplication
    @EnableEurekaClient
    public class AppTest {
        public static void main(String[] args) {
            SpringApplication.run(AppTest.class,args);
        }
    }
  4. 编写访问接口MemberController

    /**
     * @author fyzn12
     * @version 1.0
     * @date 2020/7/20 22:57
     * @description:TODO
     */
    @RestController
    public class MemberController {
        @Value("${server.port}")
        String port;
        @RequestMapping("/getMember")
        public String getMember(){
            return "this is a member 我是会员服务,端口号:"+port;
        }
    }  

5.编写订单服务项目

  1. 配置会员服务项目的pom文件(同上面pom文件配置,需要修改springcloud-study-server即可)
  2. 添加application.properties文件

        # 项目的端口号
        server.port=8001
        # 服务别名--服务注册到注册中心的名称
        spring.application.name=app-test-order
        # 当前服务注册到eureka服务地址
        eureka.client.service-url.defaultZone=http://localhost:8100/eureka
        # 需要将服务注册到eureka上面
        eureka.client.register-with-eureka=true
        # 是否需要检索服务
        eureka.client.fetch-registry=true
        spring.main.allow-bean-definition-overriding=true    
  3. 编写订单服务启动类

        /**
         * @author fyzn12
         * @version 1.0
         * @date 2020/7/21 9:03
         * @description:TODO
         */
        @SpringBootApplication
        @EnableEurekaClient
        public class AppOrder {
            public static void main(String[] args) {
                SpringApplication.run(AppOrder.class,args);
            }
            /**
             * 解决RestTemplate未能加入到Spring容器中,不能通过注解@Autowired获取bean
             *@LoadBalanced:该注解能让RestTemplate拥有负载均衡的能力
             * */
            @Bean
            @LoadBalanced
            public RestTemplate restTemplate(){
                return new RestTemplate();
            }
    
        }  
  4. 编写访问接口OrderController

    /**
     * @author fyzn12
     * @version 1.0
     * @date 2020/7/21 9:09
     * @description:TODO
     */
    @RestController
    public class OrderController {
        /**
         * RestTemplate是SpringBoot Web组件提供默认整合ribbon负载均衡器
         * rest方式
         *
         * */
        @Value("${server.port}")
        String port;
        @Autowired
        private RestTemplate restTemplate;
        @RequestMapping("/getOrder")
        public String getOrder(){
            String url = "http://app-test-member/getMember";
            String result = "我是订单服务获取会员服务信息:"+restTemplate.getForObject(url, String.class);
            System.out.println("订单服务result:"+result);
            return result;
        }
    }

6.测试

2.1.2 配置基于集群的环境

1. 客户端集群

(1) 添加一个member2项目,该项目于member只有application.properties文件中的端口号不同,其余都相同(这里只是模拟)
(2)运行订单项目,访问getOrder地址,查看端口号,测试访问的是那个端口在执行
(3) 项目中使用@LoadBalanced让RestTemplate拥有负载均衡的能力,默认采用轮训的方式去获取客户端。

2. 注册中心集群测试

(1)创建一个项目为springcloud-study-server2
(2)更改application.properties文件
    springcloud-study-server的application.properties文件如下  

        # 项目的端口号
        server.port=9100
        # 服务的注册中心ip
        eureka.instance.hostname=127.0.0.1
        # 服务别名--服务注册到注册中心的名称
        spring.application.name=app-test-server
        # 当前服务注册到eureka服务地址
        eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:8100/eureka/
        # 是否需要将服务注册到eureka注册中心上面,这里本身就是注册中心不需要(但是集群的时候需要为true)
        eureka.client.register-with-eureka=true
        # 是否需要检索服务
        eureka.client.fetch-registry=true
        spring.main.allow-bean-definition-overriding=true   



    springcloud-study-server2的application.properties文件如下   

        # 项目的端口号
        server.port=8100
        # 服务的注册中心ip
        eureka.instance.hostname=127.0.0.1
        # 服务别名--服务注册到注册中心的名称
        spring.application.name=app-test-server
        # 当前服务注册到eureka服务地址
        eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:9100/eureka/
        # 是否需要将服务注册到eureka注册中心上面,这里本身就是注册中心不需要(但是集群的时候需要为true)
        eureka.client.register-with-eureka=true
        # 是否需要检索服务
        eureka.client.fetch-registry=true
        spring.main.allow-bean-definition-overriding=true  
(3)启动所有项目
(4)故意停掉springcloud-study-server项目,再次测试
刷新http://localhost:9100/页面之后,大约30秒之后,原来处于http://localhost:8100/注册中心的地址,也刷新到http://localhost:9100/,注册中心服务集群测试成功

2.1.2 Ribbon和Nginx的区别

2.1.3 服务的雪崩效应

2.1.4 服务的隔离