赞
踩
这是本人学习的总结,主要学习资料如下
- 马士兵教育
Eureka
是SpringCloud Nexflix
的核心子模块,其中包含Server
和Client
。
Server
提供服务注册,存储所有可用服务节点。
Client
用于简化和Server
的通讯复杂度。
下面是Eureka
的简单架构图
每一个服务节点需要在Eureka Server
中注册,如果需要其他节点的服务,则需要远程调用Service Provider
,Provider
会访问Server
,由Server
找到一个合适的节点提供服务给cumsumer
,
Client
每隔30s就会向Server
发送一次心跳来续约,超过90s没有续约就会被Server
删除这个服务节点。Client
可以主动向Server
发送cancel
命令优雅下线。Client
会缓存从Server
获取的注册列表,并且每30s更新一次。接下来就是代码展示如何配置启动server
和client
,以及client
之间获取信息。
这是项目结构,两个子module,分别是server
和order-client
和user-client
。server
提供注册服务,另外两个作为client则是到server
注册然后互相调用对方的服务。
这是根目录的dependency
<properties> <java.version>1.8</java.version> <spring-boot.version>2.3.7.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR12</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
resources/application.yml
spring: application: name: msb-eureka-server server: port: 8761 eureka: instance: #注册实例名称 hostname: localhost #是否将自己的ip注册到eureka中,默认false 注册 主机名 prefer-ip-address: true # Eureka客户端需要多长时间发送心跳给Eureka,表明他仍然或者,默认是30 # 通过下面方式我们可以设置,默认单位是秒 lease-renewal-interval-in-seconds: 10 # Eurkea服务器在接受到实例最后一次发送的心跳后,需要等待多久可以将次实例删除 # 默认值是90 # 通过下面方式我们可以设置,默认单位是秒 lease-expiration-duration-in-seconds: 30 client: #是否注册到eureka服务中 register-with-eureka: false #是否拉取其他服务 fetch-registry: false
@EnableEurekaServer
@SpringBootApplication
public class EureakServerApplication {
public static void main(String[] args) {
SpringApplication.run(EureakServerApplication.class);
}
}
启动以后打开网页检查。localhost:8761
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
order-client
和```user-client````都一样,因为是单机模拟所以监听的端口号不同。
# 节点在server中注册的名字 spring: application: # user-client则用user-client name: order-client server: # order-client 监听9002, user-client监听9003 port: 9002 eureka: client: # 这个一定要配对,server地址后面默认要加一个上下文eureka service-url: defaultZone: http://localhost:8761/eureka management: endpoints: web: exposure: include: shutdown #暴露shutdown端点 endpoint: shutdown: enabled: true #再次确认暴露shutdown端点 feign: tokenId: 11111111111111111111
注意有两个注解可以将其标注为Client
,分别是@EnableDiscoveryClient
和@EnableEurekaClient
。
这里推荐使用@EnableDiscoveryClient
,因为后者是netfliex
提供的,如果使用后者,后期要更换其它注册中心就需要更换注解,比较麻烦。
这是order-client
的代码
@EnableDiscoveryClient // 这是官方提供的 ,我们以后可能切换其他的注册中心比如说nacos,那我们就直接切换就行了
//@EnableEurekaClient // 是netflix提供的,如果用这个注解就只能服务于eureka
@SpringBootApplication
public class EurekaOrderClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaOrderClientApplication.class);
}
}
这时user-client
的代码
@EnableDiscoveryClient // 这是官方提供的 ,我们以后可能切换其他的注册中心比如说nacos,那我们就直接切换就行了
//@EnableEurekaClient // 是netflix提供的,如果用这个注解就只能服务于eureka
@SpringBootApplication
public class EurekaUserClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaUserClientApplication.class);
}
}
到Server的页面查看,两个Client都注册成功。
因为RPC是基于HTTP
实现的协议,所以我们提供RPC
服务时就像写一个controller的服务一样。
这里设定order
模块会调用user
提供的服务。
@Slf4j
@RestController
public class UserController {
@RequestMapping("/getUserInfo")
public String getUser(String userId) {
log.info(userId);
return "userInfo: {userId: "+ userId +"}";;
}
}
接下来就看order
模块如何通过Eureka
调用user
提供的服务。
引入LoadBalancerClient
,从这个bean
中可以获得其他注册的client
元数据,比如地址,端口号等。
获取到这些信息后就可以组成请求地址,然后获取数据。
下面这个例子展示了如何获取其他client
的元信息并且调用其它client
的服务。
@Service public class OrderService { @Autowired private LoadBalancerClient eurekaClient; @Autowired private RestTemplate restTemplate; public void getUser() { ServiceInstance instance = eurekaClient.choose("msb-user"); String hostname = instance.getHost(); int port = instance.getPort(); String uri = "/getUserInfo?userId=" + userId; String url = "http://" + hostname + ":" + port + uri; return restTemplate.getForObject(url, String.class); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。