springcloud应用之eureka
项目下载
eureka简介
eureka是Netflix的子模块之一,也是一个核心的模块
Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。
而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行
eureka单机
单机项目结构图,我的想法是把order8000,order8001和user8100都注册到注册中心,然后user微服务负载均衡调用order微服务
服务端
新建一个springcloud maven项目,然后右键springcloud, new module选择spring initializr,下一步然后填写Group,ArtifactId之后搜索eureka选择Eureka Server,会到Selected Dependencies里点击next即可
这样他会自动帮你加上如下
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
resources里加上application.yml文件
spring:
application:
name: eureka-server
server:
port: 7000
eureka:
server:
#enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
instance:
hostname: localhost
client:
#单机情况下面两个是改成false,集群注释掉即可
registerWithEureka: false #不把自己作为一个客户端注册到自己身上
fetchRegistry: false #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
接下来只需要在他帮你自动生成的启动类加上@EnableEurekaServer,运行即可,访问localhost:7000出现网页证明配置正确
客户端
右键springcloud, new module选择spring initializr,下一步然后填写Group,ArtifactId之后搜索eureka选择Eureka Discover client,会到Selected Dependencies里点击next即可
pom文件增加
为什么服务端不用加boot依赖?是因为spring-cloud-starter-netflix-eureka-server里已经依赖了boot
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
application.yml
spring:
application:
name: order #此实例注册到eureka服务端的name
server:
port: 8000
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7000/eureka/ #eureka服务端提供的注册地址 参考服务端配置的这个路径
instance:
instance-id: order-1 #此实例注册到eureka服务端的唯一的实例ID
prefer-ip-address: true #是否显示IP地址
leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
接下来只需要在他帮你自动生成的启动类加上@EnableEurekaClient
order微服务和user微服务都这样搭建好,访问localhost:7000出现下图:
微服务调用
我们先来看看最最普通的调用方式
我们先order模块
@RestController
public class OrderController {
@RequestMapping("order")
public String order(){
return "order find";
}
}
再user模块
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
@RestController
public class UserController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("queryOrder")
public String queryOrder(){
//这种方式访问就失去了注册中心的意义
ResponseEntity<String> response = restTemplate.getForEntity("http://localhost:8000/order",String.class);
return response.getBody();
}
}
负载均衡的调用方式
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
//注意url http://order/order的第一个order是order模块的application.name的名字
//而且这种方式端口都不用写,因为ribbon帮我们做了客户端的负载均衡
ResponseEntity<String> response = restTemplate.getForEntity("http://order/order",String.class);
注意负载均衡时ribbon实现的,但是我们并没有加入ribbon依赖,这是因为eureka-client依赖了ribbon
我们可以再建一个order8001微服务,把order8000的文件都copy过来,yml文件instance-id改成这样
instance-id: order-2,server:port: 8001,注意同一组微服务客户端的application.name必须一致,例如order8000和order8001的微服务名字都是order。还可以适当修改8001 controller的内容以观察负载均衡结果
eureka集群
上面例子中我们的注册中心只有一个,万一挂了整个项目就完了,所以必须对注册中心做集群,说到这顺便再说一句eureka的注册中心只要还有一个都可以正常工作,而zookeeper是有过半机制的,这是二者的区别之一。
服务端
我们现在只有eureka-server-7000一台注册中心,我们再加两台,7001和7002,
首先修改hosts文件,路径为C:\Windows\System32\drivers\etc,添加如下三行
127.0.0.1 server7000
127.0.0.1 server7001
127.0.0.1 server7002
然后用上面新建eureka-server的办法建立eureka-server-7001和eureka-server-7002,加好注解@EnableEurekaSever
7000的yml
spring:
application:
name: eureka-server
server:
port: 7000
eureka:
server:
eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
instance:
hostname: server7000
client:
serviceUrl:
defaultZone: http://server7001:7001/eureka,http://server7002:7002/eureka
7001的yml
spring:
application:
name: eureka-server
server:
port: 7001
eureka:
server:
eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
instance:
hostname: server7001
client:
serviceUrl:
defaultZone: http://server7000:7000/eureka,http://server7002:7002/eureka
7002的yml
spring:
application:
name: eureka-server
server:
port: 7002
eureka:
server:
eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
instance:
hostname: server7002
client:
serviceUrl:
defaultZone: http://server7000:7000/eureka,http://server7001:7001/eureka
客户端
所有客户端的defaultZone改成这样
defaultZone: http://server7000:7000/eureka,http://server7001:7001/eureka,http://server7002:7002/eureka
先启动三个server,再启动三个client,访问localhost:7000出现下图证明集群搭建正确
访问localhost:8100/queryOrder负载均衡的访问order8000和order8001微服务