介绍
真糟心,Eureka官网表示不会更新了,大家换一个框架学吧,白费了我写这篇问文章了!
Eureka Server之间可以相互注册,就算其中一个挂掉了也不会影响系统的运行。
而系统中的其他微服务,使用eureka client连接到eureka server并维持心跳连接。这样系统的维护人员就可以通过eureka server来监控系统中各个微服务是否正常运行。
Eureka包含两个组件:Eureka Server和Eureka Client。 Demo运行
架构图
流程图
server配置
配置服务,可以多创建几个,只是端口不一样而已
server:
port: 8761
spring:
application:
# 多个服务都可以叫server,但你访问http://server/hi时,RestTemplate可以根据server动态获取当前可用的微服务
name: server
eureka:
instance:
# 与客户端同metadata-map.zone的会优先使用
metadata-map:
zone: cs1
client:
# 是否注册自身到eureka服务器,默认true
register-with-eureka: true
# 是否获取eureka服务器注册表上的注册信息,默认true
fetch-registry: true
# region的命名不会影响metadata-map.zone的同地区匹配
region: xibanya
availability-zones:
xibanya: cs3,cs2
# 将服务注册到其他注册中心去
service-url:
cs3: http://localhost:8763/eureka/
cs2: http://localhost:8762/eureka/
配置服务的java类
@RestController
@EnableEurekaServer
@SpringBootApplication
public class ServiceOneApplication {
private static Logger log = LoggerFactory.getLogger(ServiceOneApplication.class);
public static void main(String[] args) {
SpringApplication.run(ServiceOneApplication.class, args);
}
@RequestMapping("/ok")
public String getHi(HttpServletRequest httpServletRequest){
return "ServiceOneApplication " + httpServletRequest.getServerPort();
}
}
配置consumer
spring:
application:
# 为客户端命名
name: consumer
eureka:
instance:
# 当前的主机地址,访问服务器时会用该地址
hostname: 127.0.0.1
metadata-map:
# 配置当前服务所在的地区
zone: cs1
client:
region: hunan
availability-zones:
hunan: cs1,cs2,cs3
# 配置服务的地址,也可以是注册中心
service-url:
cs1: http://localhost:8761/eureka/
cs2: http://localhost:8762/eureka/
cs3: http://localhost:8763/eureka/
# 优先使用相同区域的服务。与consumer在同一个metadata-map.zone里的server会优先使用,
# 没有可用的再使用其他区域的微服务。默认是true
prefer-same-zone-eureka: true
server:
port: 8779
配置client的java类
@EnableDiscoveryClient
@SpringBootApplication
public class ClientApplicationOne {
public static void main(String[] args) {
SpringApplication.run(ClientApplicationOne.class, args);
}
}
@RestController
class ServiceInstanceRestController {
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/service-instances/{applicationName}")
public List<ServiceInstance> serviceInstancesByApplicationName(
@PathVariable String applicationName) {
return this.discoveryClient.getInstances(applicationName);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/hi")
public String getHi(){
return "获取成功"+restTemplate.getForObject("http://server/ok",String.class);
}
}