Spring Cloud Eureka
版本:
spring boot :2.6.4
spring cloud : 2021.0.1
一、搭建服务注册中心
1、创建springboot工程
artifactid:eureka-server,勾选springcloud-discovery里面的eureka-server
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 https://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.6.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.sww.eureka</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 
2、在启动类上加注解
@EnableEurekaServer :开启eureka注册中心功能
 
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}
 
3、添加配置
application.yml:
 
eureka:
    client:
    # 不向注册中心注册自己
    register-with-eureka: false
    # 关闭检索功能,只做注册(为微服务架构中的各个服务客户端而服务)
    fetch-registry: false
    service-url:
    # 声明注册中心的注册地址
    # 地址内容:http:// ip地址+eureka-server端口号/eureka
        defaultZone: "http://localhost:8080/eureka"
server:
    port: 8080

 
4、启动注册中心
在浏览器地址栏输入:http://localhost:8080,访问eureka注册中心
二、注册服务提供者
1、创建服务客户端实例
创建一个springboot项目,或者使用已有项目进行依赖添加
修改pom.xml,添加如下配置:
 
<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>2021.0.1</spring-cloud.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>


 
2、在启动类上加注解
@EnableEurekaClient : 开启服务客户端功能
 
@SpringBootApplication
@EnableSwagger2Doc
@EnableEurekaClient
public class SwaggerDemoApplication {
    public static void main(String[] args) throws IOException {
        SpringApplication.run(SwaggerDemoApplication.class, args);
    }
}

 
3、添加配置
application.yml:
 
eureka:
  client:
    service-url:
      defaultZone: "http://localhost:8080/eureka"    #声明注册中心的地址
 
4、启动服务客户端
观察eureka注册中心,注册进来了一个服务
三、高可用注册中心
上面的eureka注册中心只有一个,一旦发生故障,则系统不可用。马丁福勒关于微服务的论文中说到,要去中心化治理,这样一个核心的注册中心显然不能满足高可用的需求。于是,我们来搭建一个有多个eureka注册中心组成的eureka集群。
1、再创建一个springboot项目以搭建第二个服务注册中心
(步骤同:一、搭建服务 注册中心),yml文件如下:
 
# 取名eureka-server,端口:8081
server:
  port: 8081
spring:
  application:
    name: eureka-server 
eureka:
  client:
    service-url:
      defaultZone: "http://localhost:8081/eureka,http://localhost:8080/eureka/"
 
2、修改第一个注册中心的yml文件
注意: 去掉了两个false,defaultZone也修改了,让注册中心互相注册,互相发现,
 
eureka:
  client:
    service-url:
      defaultZone: "http://localhost:8081/eureka,http://localhost:8080/eureka/"
spring:
  application:
    name: eureka-server 
  server:
    port: 8080
 
3、启动两个注册中心,服务提供方,观察变化。
四、服务发现与消费
上面创建了3个springboot项目,分别是服务注册中心和服务提供方(服务生产者),但没有消费者。下面创建服务消费者去调用服务生产者提供的服务。一个服务客户端既可以是生产者也可以是消费者。
1、创建springboot项目
(1)、pom.xml:
早些时候的文章或书会让大家添加ribbon以来,但是在最新的spring cloud 官方文档中,已明确表示ribbon正处在维护模式,负载均衡默认的实现clienr为BlockingLoadBalancerClient(这是eureka-client依赖自动传递的),若项目中添加了ribbon依赖则会报错。
 
<?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 https://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.6.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.sww.eureka</groupId>
    <artifactId>ribbon-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ribbon-consumer</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

 
(2)、启动类:
restTemplate 这段方法是自己添加的
 
@EnableEurekaClient
@SpringBootApplication
public class RibbonConsumerApplication {
    @Bean
    @LoadBalanced   // 使用默认的负载均衡策略
    public RestTemplate getRestTemplate(RestTemplateBuilder builder){
        return builder.build();
    }

    public static void main(String[] args) {
        SpringApplication.run(RibbonConsumerApplication.class, args);
    }

}
 
(3)、application.yml
 
spring:
  application:
    name: consumer
server:
  port: 901
eureka:
  client:
    service-url:
      defaultZone: "http://localhost:8080/eureka/,http://localhost:8081/eureka/"
 
(4)、编写一个消费服务的controller
其中,restTmplate 是spring提供的代理发出http请求并处理返回结果的对象。
discoveryClient是用来检查注册中心是否已经成功注册了swagger-demo这个服务,我这里使用了另外一个服务提供者。
 
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate ;
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/add")
    public String testAddUser(){
        System.out.println(discoveryClient.getInstances("swagger-demo"));
        return restTemplate.getForEntity("http://swagger-demo/user/add",String.class).getBody();
    }

}

 
2、启动项目,并在浏览器访问