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、启动项目,并在浏览器访问