• IDEA 中 同一个微服务 按照多个端口启动


    网上讲这个东西的很多,抄来抄去的,大部分类似,多数没讲明白为什么那么配置。

    譬如eureka.client.register-with-eureka和fetch-registry是否要配置,配不配区别在哪里;eureka的客户端添加service-url时,是不是需要把所有的eureka的server地址都写上,还是只需要写一个server就可以了(因为server之间已经相互注册了)?如果写上了所有的server地址,那相当于将每个client服务都往所有的server都添加了一遍,那还配置server间的相互注册有什么意义?

    上面的这些问题在多数讲eureka集群教程里都没有说明白,上来就是配server相互注册,client添加所有的server地址,大大的误导了我一把。专门从头新建了项目来看看到底eureka集群是该怎么配置。

    server端配置

    创建个eureka server项目
    pom.xml如下:
    [html] view plain copy
     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    3.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
    4.     <modelVersion>4.0.0</modelVersion>  
    5.   
    6.     <groupId>com.tianyalei</groupId>  
    7.     <artifactId>eureka_server</artifactId>  
    8.     <version>0.0.1-SNAPSHOT</version>  
    9.     <packaging>jar</packaging>  
    10.   
    11.     <name>eureka_server</name>  
    12.     <description>Demo project for Spring Boot</description>  
    13.   
    14.     <parent>  
    15.         <groupId>org.springframework.boot</groupId>  
    16.         <artifactId>spring-boot-starter-parent</artifactId>  
    17.         <version>1.5.7.RELEASE</version>  
    18.         <relativePath/> <!-- lookup parent from repository -->  
    19.     </parent>  
    20.   
    21.     <properties>  
    22.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
    23.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
    24.         <java.version>1.8</java.version>  
    25.         <spring-cloud.version>Dalston.SR4</spring-cloud.version>  
    26.     </properties>  
    27.   
    28.     <dependencies>  
    29.         <dependency>  
    30.             <groupId>org.springframework.cloud</groupId>  
    31.             <artifactId>spring-cloud-starter-eureka-server</artifactId>  
    32.         </dependency>  
    33.         <dependency>  
    34.             <groupId>org.springframework.boot</groupId>  
    35.             <artifactId>spring-boot-starter-web</artifactId>  
    36.         </dependency>  
    37.   
    38.         <dependency>  
    39.             <groupId>org.springframework.boot</groupId>  
    40.             <artifactId>spring-boot-starter-test</artifactId>  
    41.             <scope>test</scope>  
    42.         </dependency>  
    43.     </dependencies>  
    44.   
    45.     <dependencyManagement>  
    46.         <dependencies>  
    47.             <dependency>  
    48.                 <groupId>org.springframework.cloud</groupId>  
    49.                 <artifactId>spring-cloud-dependencies</artifactId>  
    50.                 <version>${spring-cloud.version}</version>  
    51.                 <type>pom</type>  
    52.                 <scope>import</scope>  
    53.             </dependency>  
    54.         </dependencies>  
    55.     </dependencyManagement>  
    56.   
    57.     <build>  
    58.         <plugins>  
    59.             <plugin>  
    60.                 <groupId>org.springframework.boot</groupId>  
    61.                 <artifactId>spring-boot-maven-plugin</artifactId>  
    62.             </plugin>  
    63.         </plugins>  
    64.     </build>  
    65.   
    66.   
    67. </project>  
    application.yml如下
    [html] view plain copy
     
    1. spring:  
    2.   application:  
    3.     name: eureka  
    4.   profiles:  
    5.     active: server1  
    我用同一个项目打算启动两个server服务,占用不同的端口,以此模拟eureka服务集群。
    添加了一个application-server1.yml
    [html] view plain copy
     
    1. server:  
    2.   port: 20001  
    3. eureka:  
    4.   instance:  
    5.     hostname: server1  
    6.   client:  
    7.     # 表示是否注册自身到eureka服务器  
    8.     # register-with-eureka: false  
    9.     # 是否从eureka上获取注册信息  
    10.     # fetch-registry: false  
    11.     service-url:  
    12.       defaultZone: http://server2:20002/eureka/  
    再添加一个application-server2.yml
    [html] view plain copy
     
    1. server:  
    2.   port: 20002  
    3. eureka:  
    4.   instance:  
    5.     hostname: server2  
    6.   client:  
    7.     #register-with-eureka: false  
    8.     #fetch-registry: false  
    9.     service-url:  
    10.       defaultZone: http://server1:20001/eureka/  
    可以看到我指定了不同的端口,并且service-url这里是重点,我将server1的service-url设置为server2,将server2的设置为server1.以此完成两个server服务间的相互注册,这和别的文章里讲的是一样的,照着敲就OK。还有我把register和fetch那两个配置注释掉了,后面我们会放开,看看有没有这个配置的区别。
    instance.hostname是唯一标识。
    由于我们使用了http://server1这种写法,需要配一下host。Windows的host在/etc/host,mac的在/private/etc


    然后在启动类上加上EnableEurekaServer注解即可。
    [java] view plain copy
     
    1. @SpringBootApplication  
    2. @EnableEurekaServer  
    3. public class EurekaServerApplication {  
    4.   
    5.     public static void main(String[] args) {  
    6.         SpringApplication.run(EurekaServerApplication.class, args);  
    7.     }  
    8. }  
    下面我们来看如何分别用server1和server2两个配置启动两个server服务。
    在idea右上角run,选择edit configrations 
     
     
    原本应该只有一个启动项,点击+号,给两个启动项都设置一下Program arguments,就是--spring.profiles.active分别设置为server1和server2,代表分别以两个不同的配置来启动项目。
    然后把两个启动项都启动起来,分别访问各自的端口
     
     
     
    可以看到图上registered-replicas和available-replicas分别有了对方的地址。
    eureka服务端的配置就这样就OK了。

    client端配置

    新建一个eureka client项目。
    pom如下
    [html] view plain copy
     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    3.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
    4.     <modelVersion>4.0.0</modelVersion>  
    5.   
    6.     <groupId>com.tianyalei</groupId>  
    7.     <artifactId>eureka_client</artifactId>  
    8.     <version>0.0.1-SNAPSHOT</version>  
    9.     <packaging>jar</packaging>  
    10.   
    11.     <name>eureka_client</name>  
    12.     <description>Demo project for Spring Boot</description>  
    13.   
    14.     <parent>  
    15.         <groupId>org.springframework.boot</groupId>  
    16.         <artifactId>spring-boot-starter-parent</artifactId>  
    17.         <version>1.5.7.RELEASE</version>  
    18.         <relativePath/> <!-- lookup parent from repository -->  
    19.     </parent>  
    20.   
    21.     <properties>  
    22.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
    23.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
    24.         <java.version>1.8</java.version>  
    25.         <spring-cloud.version>Dalston.SR4</spring-cloud.version>  
    26.     </properties>  
    27.   
    28.     <dependencies>  
    29.         <dependency>  
    30.             <groupId>org.springframework.cloud</groupId>  
    31.             <artifactId>spring-cloud-starter-eureka</artifactId>  
    32.         </dependency>  
    33.         <dependency>  
    34.             <groupId>org.springframework.boot</groupId>  
    35.             <artifactId>spring-boot-starter-web</artifactId>  
    36.         </dependency>  
    37.   
    38.         <dependency>  
    39.             <groupId>org.springframework.boot</groupId>  
    40.             <artifactId>spring-boot-starter-test</artifactId>  
    41.             <scope>test</scope>  
    42.         </dependency>  
    43.     </dependencies>  
    44.   
    45.     <dependencyManagement>  
    46.         <dependencies>  
    47.             <dependency>  
    48.                 <groupId>org.springframework.cloud</groupId>  
    49.                 <artifactId>spring-cloud-dependencies</artifactId>  
    50.                 <version>${spring-cloud.version}</version>  
    51.                 <type>pom</type>  
    52.                 <scope>import</scope>  
    53.             </dependency>  
    54.         </dependencies>  
    55.     </dependencyManagement>  
    56.   
    57.     <build>  
    58.         <plugins>  
    59.             <plugin>  
    60.                 <groupId>org.springframework.boot</groupId>  
    61.                 <artifactId>spring-boot-maven-plugin</artifactId>  
    62.             </plugin>  
    63.         </plugins>  
    64.     </build>  
    65.   
    66.   
    67. </project>  
    application.yml如下
    [html] view plain copy
     
    1. spring:  
    2.   application:  
    3.     name: eureka_client  
    4. eureka:  
    5.   client:  
    6.     service-url:  
    7.       defaultZone: http://server1:20001/eureka/  
    defaultZone这里代表eureka server的地址,很多文章在这里会将所有的server都配置上去,用逗号分隔,我们这里只配置一个server1,然后测试一下如果server1挂掉了,服务中心还能不能起作用。
    在启动类上加注解eurekaClient注解
    [java] view plain copy
     
    1. @SpringBootApplication  
    2. @EnableEurekaClient  
    3. public class EurekaClientApplication {  
    4.   
    5.     public static void main(String[] args) {  
    6.         SpringApplication.run(EurekaClientApplication.class, args);  
    7.     }  
    8. }  
    然后启动项目
    再看看server端的界面



    可以看到eureka_client已经在两个server上都注册上了,虽然我们在client的yml里default_zone只配置了server1。
    其实这样就已经达到了我们的目的,所有的客户端都只指向一个eureka server地址,至于server端是怎么做高可用、怎么处理单体故障是客户端不关心的。倘若client端配置了所有server的地址,那么每当server增加删除了一个服务后,客户端就需要随之改变,那不是我们希望看到的。
    测试很简单,我们直接关掉server1,然后看看server2是否还能维持住client的发现。
    关掉server1,20001的网页已经打不开了,20002上也已经没有了20001的服务发现,控制台在一直报错。
     
     
    但是我们看到client的注册信息还在,这说明server2还能继续提供注册发现的服务,这样就避免了单点故障后的整体服务发现的瘫痪。
     
    下面我们可以测试一下把server端yml里配置register-with-eureka: false的那两行注释给放开,看看eureka的server忽略自己后,是否能完成服务发现的高可用。
    测试很简单,可以看到和上面的最终结果是一样的,都是server1关闭后,server2依旧能进行client的发现。区别在于
     
    这个就是和之前注释掉后界面不同的地方。
    至于在client端配置所有的server地址,各位可以自行尝试。
  • 相关阅读:
    Java中File类的使用
    Java集合中Comparator和Comparable接口的使用
    ODP.NET
    DllImport
    .net 项目与网站区别
    sqlserver 2012 分页
    sqlserver 分页
    ORACLE 中ROWNUM
    mysql 分页优化
    mysql windows 安装
  • 原文地址:https://www.cnblogs.com/hfultrastrong/p/8547236.html
Copyright © 2020-2023  润新知