Eureka注册与发现结合openFeign(保姆级教学)

Eureka注册与发现结合openFeign(保姆级教学,从0构建)

知识去看官网,我就是个小白,刚学会怎末使用,就分享出来,帮助刚接触这个的朋友;和nacos其实差不多一样的
一,搭建项目
二,服务端构建eureka-server
三,API
四,提供者eureka-provider
五,普通消费者eureka-client(不推荐)
六,结合fegin的消费者eureka-feign

在这里插入图片描述

一,搭建项目

在这里插入图片描述
在这里插入图片描述
因为是个微服务项目,所以删掉src,建立诸多module,如下图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里提一下:注意自己的maven本地库
在这里插入图片描述
整体构建完成大概是这样的:
在这里插入图片描述

二,服务端构建(eureka-server)

我看很多文章的时候会不理解为什莫要弄这个,所以我先讲一下目的:
服务端目的:我理解就是承载我们其他的服务的一个容器(因为是,微服务,我们需要将其他的服务注册在一个共有的服务上,才可以发现其它的服务)

  1. 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>

  1. yml文件
server:
  port: 8761
spring:
  application:
    name: eureka-server #给当前spring应用起名,唯一即可
eureka:
  client:
    register-with-eureka: false #是否注册到其他的eureka server上
    fetch-registry: false #是否从eureka server上发现其它服务
  1. 开启eurekaserver;添加注解@EnableEurekaServer
    在这里插入图片描述
  2. 启动该服务进入网址,默认: 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)

提供者:就是操作数据库获取信息,供其它的服务进行调用

  1. 使用mybaties generator逆向生成工具mybaties generator学习–传送门目的就是直接根据数据库生成我们的实体类,mapper,xml,是个很不错的工具—它会提升我们的编码效率;
  2. 使用完后,该服务结构:
    在这里插入图片描述
  3. 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>

  1. 配置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
  1. 开启eureka客户端,添加:@EnableEurekaClient在这里插入图片描述
  2. 启动当前eureka-privoder,再次观察eureka-server的:localhost:8761发现
    在这里插入图片描述
  3. 接下来完成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);
    }
    
}
  1. 测试一下我们的接口是否可以使用,涉及到后面我们能否跨服务调用

基于http形式的接口:
在这里插入图片描述
基于restful风格的接口:
在这里插入图片描述
接下来可以进行跨服务的调用了

五,普通消费者客户端(eureka-client)

有一点点落后不推荐,因为代码固定化编程了,推荐后面的fegin

  1. 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>

  1. yml
#更改默认端口,和项目访问路径
server:
  port: 8082
#数据库配置
spring:
  application:
    name: eureka-client #给当前spring应用起名,唯一即可
  1. 启动类
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
	@Bean
	RestTemplate restTemplate(){
		return new RestTemplate();
	}

	public static void main(String[] args) {
		SpringApplication.run(EurekaClientApplication.class, args);
	}

}
  1. 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);
    }
}
  1. 启动当前,查看eureka-server对应的:localhost:8761界面是否出现当前服务
    在这里插入图片描述
  2. 服务注册成功,尝试通过eureka-client访问,eureka-provider
    在这里插入图片描述

六,结合fegin消费者客户端(eureka-feign)

  1. 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>

  1. yml
#更改默认端口,和项目访问路径
server:
  port: 8083
#数据库配置
spring:
  application:
    name: first-eureka-feign #给当前spring应用起名,唯一即可
  1. 启动类;加入注解:@EnableEurekaClient,@EnableFeignClients
    在这里插入图片描述
  2. 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);
}
  1. web层
@RestController
public class UserController {
    @Autowired
    UserFeign userFeign;
    @GetMapping("/feign/query/{id}")
    public User query(@PathVariable("id") Integer id){
        return userFeign.selectUser2(id);
    }
}
  1. 启动当前服务,观察eureka-server对应的:localhost:8761界面是否出现当前服务
    在这里插入图片描述
  2. 调用当前服务的接口
    在这里插入图片描述
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值