- eureka 概述:
Eureka是Spring Cloud Netflix微服务套件中的一部分,可以与Springboot构建的微服务很容易的整合起来。
Eureka包含了服务器端和客户端组件。服务器端,也被称作是服务注册中心,用于提供服务的注册与发现。Eureka支持高可用的配置,当集群中有分片出现故障时,Eureka就会转入自动保护模式,它允许分片故障期间继续提供服务的发现和注册,当故障分片恢复正常时,集群中其他分片会把他们的状态再次同步回来。
客户端组件包含服务消费者与服务生产者。在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性的发送心跳来更新它的服务租约。同时也可以从服务端查询当前注册的服务信息并把他们缓存到本地并周期性的刷新服务状态。
- 1:服务的注册与发现,消费者调用生产者
- a, 架构图1:单实例模式
b,架构图2:注册中心单实例,服务提供者多实例
c,架构图3:注册中心多实例,服务提供者多实例
- 2:实现过程:
- 2.1:创建maven项目,完成eureka的服务端的创建
- 2.2:创建maven项目,完成eureka的客户端(服务的提供者)的创建
- 2.3:创建maven项目,完成eureka的客户端(服务的消费者)的创建
- 2.4:测试要点:
- 2.4.1,eureak服务端能被访问到,注册中心完成创建:
- 2.4.2,服务消费者,服务提供者 能注册到注册中
- 2.4.3,服务消费者通过restTemplate 完成 服务提供者的调用
- 3:服务端的实现过程:
- 3.1: maven pom文件的配置
<?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 http://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.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.bw.example</groupId> <artifactId>bw_eureka_server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>bw_eureka_server</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.RC1</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> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> </project>
3.2:application.properties
#服务端口 server.port=8761 #服务名称serviceCenter eureka.instance.hostname=yihongyuan #禁止本身注册 eureka.client.register-with-eureka=false #禁止本身注册 eureka.client.fetch-registry=false #服务中心地址 eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
3.3:启动类的配置
@SpringBootApplication @EnableEurekaServer public class BwEurekaServerApplication { public static void main(String[] args) { SpringApplication.run(BwEurekaServerApplication.class, args); } }
3.3:项目启动:测试注册中心
3:eureka 客户度 服务提供者实现过程:
3.1 pom文件,增加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
3.2:启动类配置
@SpringBootApplication @EnableDiscoveryClient @ComponentScan(value = "com") public class BwEurekaClientApplication { public static void main(String[] args) { SpringApplication.run(BwEurekaClientApplication.class, args); } }
3.3:业务代码:
@Controller public class GirlController { @Value("${server.port}") private String port; @Value("${spring.application.name}") private String hostname; public GirlController(){ System.out.print("对象呗创建"); } @ResponseBody @RequestMapping(value = "/call/{id}", method = RequestMethod.GET) public Map<String,Object> call(@PathVariable Integer id) { Map<String,Object> mm = new HashMap<String,Object>(); System.out.print("翠花出台了,台号"+id); Girls g = new Girls(); g.setGid(id); g.setGname("翠花"); mm.put("grils",g); mm.put("port",port); mm.put("hostname",hostname); System.out.println("端口号"+port+"::服务主机"+hostname); return mm; } }
3.3:application.yml
server: port: 8762 spring: application: name: girls eureka: client: eureka-server-url: defautZone: http://localhost:8761/eureka/
3.4:启动eureka 客户度,服务提供者,
可以选择启动端口号:启动多实例的服务端
3.5:测试客户端 服务提供者
3.6:在注册中心中查看客户端的注册情况
4.:启动 eureak 服务型消费者:
4.1:pom文件 引入依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
4.2:引入配置信息application.properties
server.port=8763 spring.application.name=xiaowang eureka.client.service-url.defautZone=http://localhost:8761/eureka/
4.3:启动类配置
@SpringBootApplication @EnableDiscoveryClient @ComponentScan(value = "com") public class BwEureakClientConsumerApplication { public static void main(String[] args) { SpringApplication.run(BwEureakClientConsumerApplication.class, args); } //创建RestTemplate对象 @LoadBalanced @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
4.4:服务消费者业务代码:
@Controller public class XWController { public XWController(){ System.out.print("小王对象呗创建"); } @Autowired RestTemplate rt; @RequestMapping(value = "/getFW/{id}") //@GetMapping("/getFw") @ResponseBody public String getFW(@PathVariable("id") int id){ System.out.print("小王叫服务,台号"+id); //RestTemplate template = this.getRestTemplate(); Object forObject = rt.getForObject("http://girls/call/{id}/", Object.class, id); System.out.println(forObject); return forObject.toString(); } }
4.5:启动消费者,测试
4.6:在注册中心查看: