环境
IDEA 2020.1
Maven 3.63
JDK 1.8
SpringCloud 创建注册中心和client的方法
根本资料,Spring官网的discovery
https://spring.io/guides/gs/service-registration-and-discovery/
搭建注册中心EurakeServer
(1)Spring Initializr中可以直接创建
查看此时的pom.xml和依赖树、
仅依赖netflix-eureka-server(eureka-server的依赖)、spring-boot的依赖,可以看出来eureka-server是基于在Springboot的。
<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-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
SpringCloud register的对于Server的pom文件,两者是一样的,因为都是Initializr实现的
(2)配置EurakeServer
- 修改main方法,使能eurekaServer @EnableEurekaServer
添加后如下所示:
- 修改yml配置文件
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
#这两个没看懂,后续遇到再处理
logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF
yml形式
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultzone: http://
e
u
r
e
k
a
.
i
n
s
t
a
n
c
e
.
h
o
s
t
n
a
m
e
:
{eureka.instance.hostname}:
eureka.instance.hostname:{server.port}/eureka
登录eureka界面,启动后可以看到8761,无上下文,所以登录页面http://localhost:8761/
搭建Client
搭建两个Client,一个用于服务提供者,一个用于服务消费者
创建过程
查看依赖树和pom.xml
可以看到也是基于SpringBoot的,加一个client的依赖包
<dependencies>
<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-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
配置过程
- 使能eureka客户端功能
2、配置yml
注:name和port需要分别写
server:
port: 8762
spring:
application:
name: provider
eureka:
client:
service-url:
defaultzone: http://localhost:8761/eureka
3、需要写一个controller
注:此版本SpringCloud无法使用RestController注解,需要导入starter-web的包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Controller如下:
package com.example.demo.Controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Administrator
* @since 2021/2/28 15:38
*/
@RestController
public class HelloCon {
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("hello")
public String hello(){
return "Hello";
}
}
启动Client后可以在eureka界面看到服务的注册
同样方法添加另外一个client,并注册成功
Provider和Consumer之间的调用
既然是一个提供服务,一个消费(调用)服务,那么都是返回hello是无法调用的。
调试provider
@RequestMapping("hello")
public String hello(){
System.out.println("Hello provider");
return "Hello provider";
}
调试consumer
Springboot调用接口需要RestTempleate的实体,因此注册一个RestTemplate的bean,下面先尝试不用微服务的方法。
@Configuration
public class BeanConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
然后调用provider提供的服务:
@RequestMapping("/hello")
public String hello(){
System.out.println("Hello consumer");
return restTemplate.getForEntity("http://localhost:8762/hello",String.class).getBody();
}
启动consumer后,调用结果如下:
修改为微服务方式,即通过SpringCloud调用,需要为RestTempleate添加注解
调用方式将使用根据服务名称调用
打开后,可以看到仍然可以调用到
总结:
通过搭建SpringCloud 注册中心,把provider和consumer注册进去,将根据IP和端口的调用方式改造成了根据服务名成调用的方式,不在关注各个服务所在的主机和端口等信息。