前面介绍了SpringCloud前期基础
但是服务调用方和服务提供方耦合度太高,提供方出现问题,服务不能用时,致使调用方也会出现问题。
因此Eureka出现, Eureka时一个注册中心,本身就是一个服务,可以做出集群,保证高可用(HA)。
事实上,服务提供方是拥有多个单点服务提供同一个业务功能,以保证高可用。
因此服务提供方需要往Eureka注册自身服务,而服务调用者也会向Eureka注册自身来获取可用的服务。
此外Eureka提供了心跳监听,服务续约,服务下线,服务剔除等,自行研究。这里简单介绍如何部署Eureka注册中心,注册服务,获取服务等。
先把项目列出来
https://github.com/mingweihua/ming-cloud
两个Eureka Server也就是Eureka注册中心,两个保证可高用性;
两个Service也就是服务提供方,业务功能一致,提供同一个服务,两个数量也是保证高可用性;
一个Consumer也就是服务消费方/调用方。
版本号在父工程(project)进行管理,子模块(module)只导入相应依赖包
ming-cloud
cn.sysu
0.0.1-SNAPSHOT
4.0.0
eureka-server
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
只需要引入spring-cloud-starter-netflix-eureka-server即可。
编写启动类,添加注解,与Springboot一样。重点是@EnableEurekaServer注解,表明这是Eureka Server
@EnableEurekaServer
@SpringBootApplication
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
最后配置文件
server:
port: 8011 #DEFAULT_URL = "http://localhost:8761" #
spring:
application:
name: eureka-server-ming
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8011/eureka, http://127.0.0.1:8012/eureka
注意点:
(1)不配置端口:默认是8761
(2)spring.application.name是最后会在Eureka Server中application的名字,也是后期调用服务使用的一个application id。
(3)eureka.client.service-url的值为Map,默认key为defaultZone, http://127.0.0.1:8011/eureka, http://127.0.0.1:8012/eureka分别表示向Eureka Server注册自己,以及向另一台Eureka Server注册。
另一台Eureka Server同理配置,端口换成8012。
也就是服务提供方和消费方,都作为Eureka Client向Eureka Server注册。
服务提供方
引入依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
启动类
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class,args);
}
}
重点是@EnableDiscoveryClient
也可以@EnableEurekaClient,但是使用@EnableEurekaClient,注册中心只能是Eureka,而EnableDiscoveryClient兼容Eureka,也能方便别的注册中心是别的技术实现。
业务功能自己编写
配置文件,向两台Eureka Server注册服务,服务名(application name为service-ming,另一个服务提供方也是类似,端口换成8022)
server:
port: 8021
servlet:
context-path: /service
spring:
application:
name: service-ming
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8011/eureka, http://127.0.0.1:8012/eureka
服务消费方
类似配置,不再说了
Controller测试
注入DiscoveryClient
//用于动态拉取相应服务的地址
@Autowired
private DiscoveryClient discoveryClient;
通过application ID也就是上面的application name来获取相应的服务,服务提供方的服务名是service-ming
@RequestMapping("/test2")
public List test2() {
log.info("动态从Eureka服务器根据application id/name获取服务");
List instances = discoveryClient.getInstances("service-ming");
ServiceInstance serviceInstance = instances.get(0);
String url = serviceInstance.getUri() + "/service/getAllZKData";
log.info(url);
List zk_collects = restTemplate.getForObject(url, List.class);
return zk_collects;
}
测试成功。
至此,就不需要在服务调用方写死提供方相关信息,只需要写明需要什么服务,去注册中心查询相关服务。此外Eureka Server还有很多配置,例如多久识别下线的服务,服务剔除之类的,这些我建议到官网上看,用不到反正就用默认值(约定大于配置)。
Eureka Server的页面如下:(以8011端口的 Eureka Server为例)
虽然比较简单,但是抽空写博客给大家参考不容易,欢迎大家点个赞,评论之类的。你们的赞扬和肯定是博主们坚持的动力,谢谢!