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地址,各位可以自行尝试。
posted @ 2018-03-12 00:54  GordonDicaprio  阅读(12747)  评论(3编辑  收藏