这是本人学习的总结,主要学习资料如下
- 马士兵教育
目录
- 1、Spring Cloud 简介
- 2、Eureka
- 3、建立Spring Cloud项目
- 3.1、启动Server
- 3.1.1、dependency
- 3.1.2、配置文件
- 3.1.3、Server端启动代码
- 3.2、启动Client
- 3.2.1、dependency
- 3.2.2、配置文件
- 3.3.3、Client端启动代码
- 3.3、服务之间获取信息
1、Spring Cloud 简介
spring cloud
是为了解决微服务架构的难题而诞生的微服务全家桶框架。
确定spring cloud
的版本,要根据spring boot
来确定,官网上有对应的表格。
注意下面的提示,Dalston, Edgware, Finchley, Greenwich
已经不再维护,所以实际开发中不要再使用这四个spring cloud
的版本。
2、Eureka
Eureka
是SpringCloud Nexflix
的核心子模块,其中包含Server
和Client
。
Server
提供服务注册,存储所有可用服务节点。
Client
用于简化和Server
的通讯复杂度
下面是Eureka
的简单架构图
每一个服务节点需要在Eureka Server
中注册,如果需要其他节点的服务,则需要远程调用Service Provider
,Provider
会访问Server
,由Server
找到一个合适的节点提供服务给cumsumer
,
3、建立Spring Cloud项目
接下来就是代码展示如何配置启动server
和client
,以及client
之间获取信息
3.1、启动Server
3.1.1、dependency
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<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-dependencies</artifactId>
<version>2.3.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
3.1.2、配置文件
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
3.1.3、Server端启动代码
@EnableEurekaServer
@SpringBootApplication
public class EureakServerApplication {
public static void main(String[] args) {
SpringApplication.run(EureakServerApplication.class);
}
}
启动以后打开网页检查。
3.2、启动Client
3.2.1、dependency
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3.2.2、配置文件
# 节点在server中注册的名字
spring:
application:
name: msb-order
server:
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
3.3.3、Client端启动代码
注意有两个注解可以将其标注为Client
,分别是@EnableDiscoveryClient
和@EnableEurekaClient
。
这里推荐使用@EnableDiscoveryClient
,因为后者是netfliex
提供的,如果使用后者,后期要更换其它注册中心就需要更换注解,比较麻烦。
@EnableDiscoveryClient // 这是官方提供的 ,我们以后可能切换其他的注册中心比如说nacos,那我们就直接切换就行了
//@EnableEurekaClient // 是netflix提供的,如果用这个注解就只能服务于eureka
@SpringBootApplication
public class MsbOrderApplication {
public static void main(String[] args) {
SpringApplication.run(MsbOrderApplication.class);
}
}
同样的配置和代码,再启动一个叫msb-stock
的服务
到Server的页面查看,两个服务都注册成功。
3.3、服务之间获取信息
引入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);
}
}