Eureka注册与发现结合openFeign(保姆级教学,从0构建)
知识去看官网,我就是个小白,刚学会怎末使用,就分享出来,帮助刚接触这个的朋友;和nacos其实差不多一样的
一,搭建项目
二,服务端构建eureka-server
三,API
四,提供者eureka-provider
五,普通消费者eureka-client(不推荐)
六,结合fegin的消费者eureka-feign
一,搭建项目
因为是个微服务项目,所以删掉src,建立诸多module,如下图
这里提一下:注意自己的maven本地库
整体构建完成大概是这样的:
二,服务端构建(eureka-server)
我看很多文章的时候会不理解为什莫要弄这个,所以我先讲一下目的:
服务端目的:我理解就是承载我们其他的服务的一个容器(因为是,微服务,我们需要将其他的服务注册在一个共有的服务上,才可以发现其它的服务)
- pom.xml文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yyx.cloud</groupId>
<artifactId>eureka-server</artifactId>
<version>1.0.0</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- yml文件
server:
port: 8761
spring:
application:
name: eureka-server #给当前spring应用起名,唯一即可
eureka:
client:
register-with-eureka: false #是否注册到其他的eureka server上
fetch-registry: false #是否从eureka server上发现其它服务
- 开启eurekaserver;添加注解@EnableEurekaServer
- 启动该服务进入网址,默认: localhost:8761,(当前没有客户端注册到该服务端)
三,API
API目的:将API项目坐标以maven形式导入不同的服务,实现实体类的解耦(我理解的)
建立数据库myshopping,数据库表user
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`user_Sex` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`user_age` tinyint(100) NOT NULL,
`user_bith` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '学生表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
maven依赖,后面需要用这个对时间进行格式化
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
注意:后面使用mybatis generator生成的User实体类给对应的Bith字段加上@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
才可以进行添加用户,作用是对前端传入的时间格式进行格式化
四,提供者(reureka-provider)
提供者:就是操作数据库获取信息,供其它的服务进行调用
- 使用mybaties generator逆向生成工具mybaties generator学习–传送门目的就是直接根据数据库生成我们的实体类,mapper,xml,是个很不错的工具—它会提升我们的编码效率;
- 使用完后,该服务结构:
- pom.xml文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yyx.cloud</groupId>
<artifactId>eureka-provider</artifactId>
<version>1.0.0</version>
<name>eureka-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.1</spring-cloud.version>
</properties>
<dependencies>
<!-- eureka 客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--mybatis.generator:项目逆向生成工具依赖 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
<!--引入MySQL的依赖关系-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--使用API下的实体类-->
<dependency>
<groupId>com.yyx.cloud</groupId>
<artifactId>API</artifactId>
<version>1.0.0</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- mybatis generator 自动生成代码插件 ,这里输入自己创建的mybatis-generator-config.xml地址-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>
..\eureka-provider\src/main/resources/mybatis-generator-config.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 配置application.yml
server:
port: 8081
spring:
application:
name: eureka-privoder #给当前spring应用起名,唯一即可
#操作数据库必备
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
#日志打印
logging:
level:
com.yyx.cloud.user.mapper: debug
#配置mybatis
mybatis:
#指定xml文件扫描路径
mapper-locations: classpath:mapper/*.xml
- 开启eureka客户端,添加:@EnableEurekaClient
- 启动当前eureka-privoder,再次观察eureka-server的:localhost:8761发现
- 接下来完成controller包下的基于RESTful风格的接口
//controller层,思考一下为什莫我要写个*2方法,因为,底层mapper的实现有两种形式,自己下去学习一下
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
UserService userService;
@PostMapping("/addUser")
public int addUser(@RequestBody User user) {
return userService.addUser(user);
}
@PostMapping("/addUser2")
public int addUser2(@RequestBody User user) {
return userService.addUser2(user);
}
@DeleteMapping("/delUser")
public int deleteUser(@Param("userId") Integer userId) {
return userService.delUser(userId);
}
@DeleteMapping("/delUser2/{userId}")
public int deleteUser2(@PathVariable("userId") Integer userId) {
return userService.delUser(userId);
}
@PutMapping("/updateUser")
public int updateUser(@RequestBody User user) {
return userService.updateUser(user);
}
@PutMapping("/updateUser2")
public int updateUser2(@RequestBody User user) {
return userService.updateUser2(user);
}
@GetMapping("/selectUser")
public User selectUser(Integer id) {
return userService.selectUser(id);
}
@GetMapping("/selectUser2/{id}")
public User selectUser2(@PathVariable("id") Integer id) {
return userService.selectUser2(id);
}
}
//service层
@Service
public interface UserService {
int addUser(User user);
int addUser2(User user);
int delUser(int userId);
int updateUser(User user);
int updateUser2(User user);
User selectUser(Integer id);
User selectUser2(Integer id);
}
//serviceImpl层
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
public int addUser(User user) {
return userMapper.insert(user);
}
public int addUser2(User user) {
return userMapper.insertSelective(user);
}
public int delUser(int userId) {
return userMapper.deleteByPrimaryKey(userId);
}
public int updateUser(User user) {
return userMapper.updateByPrimaryKey(user);
}
public int updateUser2(User user) {
return userMapper.updateByPrimaryKeySelective(user);
}
public User selectUser(Integer id) {
return userMapper.selectByPrimaryKey(id);
}
public User selectUser2(Integer id) {
return userMapper.selectByPrimaryKey(id);
}
}
- 测试一下我们的接口是否可以使用,涉及到后面我们能否跨服务调用
基于http形式的接口:
基于restful风格的接口:
接下来可以进行跨服务的调用了
五,普通消费者客户端(eureka-client)
有一点点落后不推荐,因为代码固定化编程了,推荐后面的fegin
- pom.xml文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yyx.cloud</groupId>
<artifactId>eureka-client</artifactId>
<version>1.0.0</version>
<name>eureka-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- yml
#更改默认端口,和项目访问路径
server:
port: 8082
#数据库配置
spring:
application:
name: eureka-client #给当前spring应用起名,唯一即可
- 启动类
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
@Bean
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
- web层
@RestController
public class UserControllerClient {
@Autowired
RestTemplate restTemplate;
@GetMapping("/find/{id}")
public String test(@PathVariable String id) {
return restTemplate.getForObject("http://localhost:8081/user/selectUser2/" + id, String.class);
}
}
- 启动当前,查看eureka-server对应的:localhost:8761界面是否出现当前服务
- 服务注册成功,尝试通过eureka-client访问,eureka-provider
六,结合fegin消费者客户端(eureka-feign)
- pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yyx.cloud</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-fegin</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>com.yyx.cloud</groupId>
<artifactId>API</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>API</artifactId>
<version>2.6.5</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- yml
#更改默认端口,和项目访问路径
server:
port: 8083
#数据库配置
spring:
application:
name: first-eureka-feign #给当前spring应用起名,唯一即可
- 启动类;加入注解:@EnableEurekaClient,@EnableFeignClients
- service层(重点来了!!!!)
//value:写入需要调用哪个服务的服务名称,
// path:地址(比如:你给需要调用的服务设置了servlet.context-path:/my 那么这一块可以写/my,我这里没有
// 同时你的@RequestMapping(“/user”) 那么可以写/my/user ,我这里是/user)
@FeignClient(value = "EUREKA-PRIVODER",path = "/user")
public interface UserFeign {
//把需要调用的服务下的controller的某个想要调用的方法的方法头拿过来
@GetMapping("/selectUser2/{id}")
public User selectUser2(@PathVariable("id") Integer id);
}
- web层
@RestController
public class UserController {
@Autowired
UserFeign userFeign;
@GetMapping("/feign/query/{id}")
public User query(@PathVariable("id") Integer id){
return userFeign.selectUser2(id);
}
}
- 启动当前服务,观察eureka-server对应的:localhost:8761界面是否出现当前服务
- 调用当前服务的接口