SpringCloud是依赖于SpringBoot和Maven建立微服务,因此学习SpringCloud之前一定要先能熟练使用SpringBoot和Maven,这样可以减少学习SpringCloud时踩坑。
简单的服务调用:RestTemplate
服务提供者:CloudProvider
POM文件:只需要引入springBoot对web支持的jar包(启动类这里就不再赘述)。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Controller:
@RestController
public class CloudProviderController {
@GetMapping("/provider/get/{message}")
public String getString(@PathVariable String message){
return "cloudProvider 被调用: "+ message;
}
}
application.yml:
server:
port: 8080
服务消费者CloudConsumer:
POM文件:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Controller:
@RestController
public class CloudConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/get/{message}")
public String getString(@PathVariable("message") String message){
return restTemplate.getForObject("http://localhost:8080/provider/get/"+message,String.class);
}
}
注意,Controller中引入一个实例——RestTemplate,它是Spring提供的用于访问Rest服务的客户端,提供了多种便捷访问远程Http服务的方法。这里需要先把RestTemplate注入到容器中,才能进行引用。
config配置文件:
@Configuration
public class config {
@Bean(name="restTemplate")
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
application.yml文件:
server:
port: 8082
浏览器访问:http://localhost:8082/consumer/get/12345
输出结果:
我们访问8082端口,cloudConsumer方法,获取到了8080端口cloudProvider返回的信息。这是服务之间直接通过HTTP协议进行访问。这样的访问类型比较直接,但是如果服务调用发生问题,我们不能知道是服务停掉了,还是网络出现故障,也不能对服务进行管理和监测。因此Eureka等服务注册和管理的中间件就产生了。
Eureka:
Eureka是Spring Cloud Netflix微服务套件中的一部分,可以与Springboot构建的微服务很容易的整合起来。
Eureka包含了服务器端和客户端组件。
- 服务器端,即服务注册中心,用于提供服务的注册与发现。Eureka支持高可用的集群配置,当集群中有分片出现故障时,Eureka就会转入自动保护模式,它允许分片故障期间继续提供服务的发现和注册,当故障分片恢复正常时,集群中其他分片会把他们的状态再次同步回来。
- 客户端组件包含服务消费者与服务生产者。在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性的发送心跳来更新它的服务租约。同时也可以从服务端查询当前注册的服务信息并把他们缓存到本地并周期性的刷新服务状态。
Eureka注册中心建立:EurekaServer
POM文件:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
启动类:
@SpringBootApplication
@EnableEurekaServer
public class EurekaStarter {
public static void main(String[] args) {
SpringApplication.run(EurekaStarter.class,args);
}
}
启动类上多添加了一个注解:@EnableEurekaServer,开启Eureka服务端功能。其实这是在SpringBoot 底层启用Eureka服务端EurekaServer的默认配置类。
application.yml
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,不需要检索服务
#设置与Eureka Server交互的地址查询服务和注册微服务依赖的地址。微服务注册进该地址,Eureka会到这个地址检索微服务
service-url: defaultZone: http://localhost:7001/eureka/
这是启动EurekaServer,在浏览器中输入:loalhost:7001,会进入到Eureka服务管理页面:
进入Eureka的服务管理页面,看到Application下显示No instance available 选项,表示还没有任何服务注册进Eureka中。
服务注册进Eureka:
POM文件:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
启动类:
@SpringBootApplication
@EnableEurekaClient
public class CloudProviderStarter {
public static void main(String[] args) {
SpringApplication.run(CloudProviderStarter.class);
}
}
服务提供者cloudProvider的启动类上,新增了一个注解@EnableEurekaClient,表示开启Eureka的客户端服务注册功能,将该微服务注册进Eureka中。
application.yml:
server:
port: 8080 #服务端口
spring:
application:
name: cloud-provider-8080 #服务名,也就是注册进Eureka中后,该服务的名字
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/ #Eureka注册中心地址,将服务注册进该地址
application.yml配置文件中,指定了服务的端口号、服务名、服务的注册地址。
controller文件不需要做变动。配置完成之后启动cloudProvider(这之前要保证Eureka服务端已经启动),刷新Eureka管理页面,这时会发现服务已经注册进Eureka中: