SpringCloud Eureka注册服务与发现(一)
SpringCloud简介
SpringCloud是基于SpringBoot基础之上开发的微服务框架,SpringCloud是一套目前非常完整的微服务解决方案框架,其内容包含服务治理、注册中心、配置管理、断路器、智能路由、微代理、控制总线、全局锁、分布式会话等。
springcloud核心组件:
- Eureka:服务治理 注册中心
- Hystrix:服务保护框架
- Ribbon:客户端负载均衡器
- Feign:基于ribbon和hystrix的声明式服务调用组件
- Zuul: 网关组件,提供智能路由、访问过滤等功能
相关组件架构图
Eureka服务注册中心
Eureka原理图
创建服务注册中心
- 创建Maven主工程(省略自己创建)
- 创建子模块eureka-server服务注册中心
<!-- eureka-server依赖 -->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.springcloud</groupId>
<artifactId>SpringCloud-Eureka</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.springcloud</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<properties>
<java.version>1.8</java.version>
</properties>
<!-- 管理依赖 -->
<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>
<!--Eureka-Server-->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- 解决依赖问题 -->
<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>
</project>
#eureka-server相关配置
#注册地址端口号
server:
port: 9000
eureka:
#注册到注册中心地址
instance:
hostname: locahost
client:
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#是否注册到注册中心(注意:如果是集群为true)
register-with-eureka: false
#是否需要检索(注意:如果是集群为true)
fetch-registry: false
Eureka-Server启动类
@SpringBootApplication
//@EnableEurekaServer开启eureka-server服务
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
启动eureka-server项目、访问http://localhost:9000
- 创建子模块eureka-client服务提供者
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.springcloud</groupId>
<artifactId>SpringCloud-Eureka</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.springcloud</groupId>
<artifactId>eureka-client-provide</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-client-provide</name>
<properties>
<java.version>1.8</java.version>
<mybatis-spring-boot.version>2.0.0</mybatis-spring-boot.version>
<druid.version>1.1.3</druid.version>
<mybatis-plus.version>3.0.1</mybatis-plus.version>
</properties>
<!-- 管理依赖 -->
<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>
<!-- SpringBoot整合eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<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>
</project>
#eureka-client服务提供相关配置
server:
port: 8002
spring:
datasource:
url: jdbc:mysql://localhost:3306/springcloud?tinyInt1isBit=false&characterEncoding=UTF-8&useSSL=true&allowMultiQueries=true&serverTimezone=UTC
username: root
password:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
filters: stat,wall,log4j
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
connection-properties: druid.stat.merggSql=ture;druid.stat.slowSqlMillis=5000
application:
name: eurake-client-provide
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka
register-with-eureka: true
fetch-registry: true
Eureka-Client服务提供者启动类
@SpringBootApplication
@EnableEurekaClient
@MapperScan("com.springcloud.eurekaclientprovide.mapper")
public class EurekaClientProvideApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientProvideApplication.class, args);
}
}
启动eureka-client服务提供者
rureka-server自我保护机制开启了、可以不用处理
- 创建子模块eureka-client服务消费者
<!--eureka-client服务消费者依赖-->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.springcloud</groupId>
<artifactId>SpringCloud-Eureka</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.springcloud</groupId>
<artifactId>eureka-client-consume</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-client-consume</name>
<properties>
<java.version>1.8</java.version>
</properties>
<!-- 管理依赖 -->
<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>
<!-- SpringBoot整合eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<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>
</project>
#eureka-client服务提供者相关配置
server:
port: 8001
spring:
application:
name: eurake-client-consume
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka
register-with-eureka: true
fetch-registry: true
//eureka-client服务消费者启动类
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientConsumeApplication {
//这里使用RestTemplate 进行服务消费调用
private RestTemplate restTemplate;
public static void main(String[] args) {
SpringApplication.run(EurekaClientConsumeApplication.class, args);
}
//@LoadBalanced让RestTemplate在请求时拥有客户端负载均衡的能力
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
启动eureka-client服务消费者
项目搭建展示
简单实现服务消费实例
服务消费代码
@RestController
@RequestMapping("/consume")
public class UserController {
@Autowired
private RestTemplate restTemplate;
//读取配置文件(服务提供调用地址)
@Value("${user.grtUserPath}")
private String getByUserUrl;
@GetMapping("/getById")
public String getClientUser(@RequestParam Long id){
Map<String,Object> map = new HashMap<>();
map.put("id",id);
String user = restTemplate.getForObject(this.getByUserUrl+"?id={id}", String.class,map);
return user;
}
}
服务提供者代码
@RestController
@RequestMapping("/provide")
public class ClientUserController {
@Autowired
private UserService userService;
@GetMapping("/getById")
public String getById(@RequestParam Long id){
return userService.getById(id).toString();
}
}
启动所有服务、访问http://localhost:8001/consume/getById?id=1