大家好,又见面了,我是你们的朋友全栈君。
Eureka 集群
介绍 注册中心Eureka
又称服务中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等。
任何一个服务都不能直接去掉用,都需要通过注册中心来调用。通过服务中心来获取服务你不需要关注你调用的项目IP地址,由几台服务器组成,每次直接去服务中心获取可以使用的服务去调用既可。
由于各种服务都注册到了服务中心,就有了很多高级功能条件。比如几台服务提供相同服务来做客户端负载均衡(Ribbon);监控服务器调用成功率来做断路器(Hystrix),移除服务列表中的故障点;监控服务调用时间来对不同的服务器设置不同的权重、智能路有(Zuul)等等。
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。
Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡
1、Eureka Server
- Eureka Server 作为一个独立的部署单元,以 REST API 的形式为服务实例提供了注册、管理和查询等操作。同时,Eureka Server 也为我们提供了可视化的监控页面,可以直观地看到各个 Eureka Server 当前的运行状态和所有已注册服务的情况。
2、Service Provider
- 服务提供方
- 将自身服务注册到Eureka,从而使服务消费方能够找到
3、Service Consumer
- 服务消费方
- 从Eureka获取注册服务列表,从而能够消费服务
Eureka集群部署
-
新建一个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 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.2.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>ink.pog</groupId> <artifactId>eurekaserver</artifactId> <version>0.0.1-SNAPSHOT</version> <description>Demo project for Spring cloud</description> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR4</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>
-
配置yml
server: # 设置端口号 port: 7001 spring: application: name: eurekaserver eureka: instance: # 单机hostname为localhost hostname: eureka7001.com # 如果启用了ip注册地址,那么篡改了hosts文件也没用,会让hostname无效,显示的ip地址 prefer-ip-address: false client: # 是否从Eureka Server获取注册信息 fetch-registry: true # 是否将自己注册到Eureka Server # 因为这里是集群所以需要将自己注册到Eureka Server,单机则不需要 register-with-eureka: true service-url: # 配置其他集群的地址进行相互注册 defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
由于是集群,以及配置了hostname和http://eureka7002.com的写法,所以需要我们去hosts进行配置
hosts文件的位置在: C:\Windows\System32\drivers\etc
127.0.0.1 eureka7003.com 127.0.0.1 eureka7002.com 127.0.0.1 eureka7001.com
-
开启对Eureka Server的支持
@SpringBootApplication @EnableEurekaServer public class EurekaserverApplication { public static void main(String[] args) { SpringApplication.run(EurekaserverApplication.class, args); } }
剩下的两个服务中心也是这样配置,就不贴了
提供者配置
-
创建一个maven工程,pom跟集群部署的pom类似,只不过要添加数据库之类的东西,这样就不贴了
-
配置yml文件
server: port: 8001 spring: application: # 这个实例名很重要,这在以后的消费者与提供者之间相互调用一般都是根据这个name name: producter datasource: url: jdbc:mysql://localhost/crud?useUnicode=true&characterEncoding=utf-8 username: root password: root driver-class-name: com.mysql.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true eureka: instance: instance-id: springcloud-eureka-producter prefer-ip-address: true client: fetch-registry: true # 向服务中心注册自己 register-with-eureka: true service-url: # 因为是集群部署,所以需要向所有的集群注册自己 defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/,http://eureka7002.com:7002/eureka/
-
写提供的方法
@RestController public class EmplyeeController { @Autowired private EmplyeeService emplyeeServiceImpl; @GetMapping("/empl/get/{id}") public Emplyee get(@PathVariable("id")int id){ return emplyeeServiceImpl.get(id); } @GetMapping("/empl/get") public List<Emplyee> getAll(){ return emplyeeServiceImpl.getAll(); } }
-
开启Eureka client
@SpringBootApplication @EnableEurekaClient public class Producter8001Application { public static void main(String[] args) { SpringApplication.run(Producter8001Application.class, args); } }
这样一个提供者的服务就配置好,下面贴一个提供者项目的结构
消费者部署
-
创建maven工程,配置pom
-
配置yml
eureka: instance: instance-id: consumer80 client: register-with-eureka: true service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ fetch-registry: true
-
因为是基本RestFul风格,所以需要配置一下RestTemplate以及负载均衡LoadBalanced
@Configuration public class config { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
-
写消费者方法
@RestController public class EmplyeeConsumer { @Autowired private DiscoveryClient client; # 获取服务信息类 @Autowired private RestTemplate restTemplate; # 这里的前缀就是刚才配置提供者的实例名字,spring.application.name private static final String REST_URL_PREFIX = "http://PRODUCTER"; @GetMapping("/empl/get/{id}") public Emplyee get(@PathVariable("id")int id){ return restTemplate.getForObject(REST_URL_PREFIX+"/empl/get",Emplyee.class); } @GetMapping("/empl/get") public List<Emplyee> getAll(){ return restTemplate.getForObject(REST_URL_PREFIX + "/empl/get",List.class); } # 获取微服务的信息 @GetMapping("/info") public List<ServiceInstance> info(){ List<ServiceInstance> eurekaserver = client.getInstances("EUREKASERVER"); return eurekaserver; } }
运行集群
至此,一个集群的配置就好了,接下运行一下试试,首先启动服务中心
然后接着启动提供者以及消费者,访问即可
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139457.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...