概要:
服务注册中心有很多如:eureka,zookeeper,consul,nacos等。
本篇主要讲eureka在代码中的基本使用及相关知识总结。
案例:实现博客管理服务(消费者)blog-server 调用用户信息服务(生产者)
项目搭建总体思路
由于项目较多,所以我在搭建的时候使用maven聚合工程,父工程(springcloud01),注册中心2个实现高可用(springcloud-eureka,springcloud-eureka02),用户信息服务(user-server),博客管理服务(blog-server)。
流程图:
手把手搭建代码
maven聚合工程搭建:
父工程maven依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.10.RELEASE</version>
</parent>
<!-- 管理依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--SpringCloud eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
1. 搭建微服务注册中心01(10086)
maven依赖:
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
yml配置:
###服务端口号
server:
port: 10086
###eureka 基本信息配置
eureka:
instance:
###注册到eurekaip地址
hostname: 127.0.0.1
client:
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:10087/eureka/
###因为自己是为注册中心,不需要自己注册自己(集群时改为true)
register-with-eureka: true
###因为自己是为注册中心,不需要检索服务(集群时改为true)
fetch-registry: true
spring:
application:
name: eureka-server
启动类:
@SpringBootApplication
@EnableEurekaServer
public class AppEureka {
public static void main(String[] args) {
SpringApplication.run(AppEureka.class, args);
}
}
启动项目,访问localhost:10086
搭建微服务注册中心02(10087)
与注册中心01搭建流程一致,区别在于yml配置:
###服务端口号
server:
port: 10087
###eureka 基本信息配置
eureka:
instance:
###注册到eurekaip地址
hostname: 127.0.0.1
client:
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:10086/eureka/
###因为自己是为注册中心,不需要自己注册自己
register-with-eureka: true
###因为自己是为注册中心,不需要检索服务
fetch-registry: true
spring:
application:
name: eureka-server
注意:10086与10087的服务名称(serverid)必须保持一致
将10086项目停了之后访问10087
这样就完成了注册中心的高可用。由于一旦注册中心挂了之后,所有的微服务全部瘫痪,所以一般注册中心需要搭建集群。
2. 搭建生产者用户信息服务user-server
maven依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
yml配置
###服务启动端口号
server:
port: 10081
###服务名称(服务注册到eureka名称)
spring:
application:
name: user-server
###服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
###因为该应用为注册中心,不会注册自己
register-with-eureka: true
###是否需要从eureka上获取注册信息
fetch-registry: true
启动类:
@SpringBootApplication
@EnableEurekaClient
public class AppUserServer {
public static void main(String[] args) {
SpringApplication.run(AppUserServer.class, args);
}
}
controller层
@RestController
@RequestMapping("user")
public class UserController {
@Value("${server.port}")
private String serverPort;
@RequestMapping("/getUser")
public String getMember() {
return "this is getUser" + serverPort;
}
}
启动项目后修改端口再次启动(生产者服务启动2次,为后续客户端负载均衡准备)
访问eureka管理页面:localhost:10086
从图中可看到user-server服务启动了2个,分别为10081和10086两个端口。
3. 搭建消费者服务博客管理blog-server
maven依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
yml配置
###服务启动端口号
server:
port: 10082
###服务名称(服务注册到eureka名称)
spring:
application:
name: blog-server
###服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
###因为该应用为注册中心,不会注册自己
register-with-eureka: true
###是否需要从eureka上获取注册信息
fetch-registry: true
启动类:
@SpringBootApplication
@EnableEurekaClient
public class AppBlogServer {
public static void main(String[] args) {
SpringApplication.run(AppBlogServer.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@LoadBalanced就能让这个RestTemplate在请求时拥有客户端负载均衡的能力
controller层:
@RestController
@RequestMapping("blog")
public class BlogController {
@Autowired
private RestTemplate restTemplate;
@Value("${server.port}")
private String serverPort;
@RequestMapping("delBlog")
public String delBlog() {
// blog 使用rpc 远程调用技术 调用 用户服务
String userUrl = "http://user-server/user/getUser";
String result = restTemplate.getForObject(userUrl, String.class);
System.out.println("博客管理服务调用用户信息服务,result:" + result);
return result;
}
}
启动项目,访问localhost:10082/blog/delBlog
再次刷新:
从上面2次访问可以发现,2次远程调用的服务端口不一样,说明了客户端的负载均衡生效。