【视频&交流平台】
http://study.163.com/course/introduction.htm?courseId=1004638001
http://412887952-qq-com.iteye.com/blog/2321532
在微服务中最基本最基本的两个角色是服务提供者与服务消费者。
之前所有代码都在同一个框架的时候,比如Controller调用Service的,直接注入Service bean即可进行调用了。现在做成微服务之后,那么我们就需要有一个工程专门提供相应的服务功能,对应的有相应的工程消费这个功能,这就是服务提供者和服务消费者最基本的概念。好了,今天我们就实战来学习下。
本节大纲:
(2)编码思路
(3)服务提供者编码
(4)服务消费者编码
(5)存在问题
接下来看下具体的内容:
(1)服务提供者与服务消费者概念
服务提供者:服务的被调用方(即,为其他服务提供服务的服务);
服务消费者:服务的调用方(即,依赖其他服务的服务);
(2)编码思路
这里我们使用最基本的方式实现服务提供者和服务消费者。
(1)两个项目,一个服务提供者,一个是服务消费者;
(2)服务提供者从内存数据库H2中查询数据,Controller进行调用获取;
(3)服务消费者调用服务提供者的Controller进行获取数据,然后返回给浏览器。
(3)服务提供者编码
à新建工程
新建一个提供用户信息的工程,取名为:microservie-provider-user
à在pom.xml添加依赖包
<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> <groupId>com.kfit</groupId> <artifactId>ms-provider-user</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>ms-provider-user</name> <url>http://maven.apache.org</url> <!-- spring boot parent节点,引入这个之后,在下面和spring boot相关的就不需要引入版本了; --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.1.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- web支持: 1、web mvc; 2、restful; 3、jackjson支持; 4、aop ........ --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 内存数据库h2 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <!-- spring data jpa --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> </dependencies> </project>
à在src/main/resources下新建schema.sql添加建表语句
创建了一张User表:
drop table user if exists; create table user( id bigint generated bydefaultas identity, username varchar(40), name varchar(20), age int(3), balance decimal(10,2), primarykey(id) );
à在src/main/resources/新建data.sql插入数据
在User表插入几条数据进行测试:
insert into user(id,username,name,age,balance) values(1,'user1','张三',20,100.00); insert into user(id,username,name,age,balance) values(2,'user2','李四',20,100.00); insert into user(id,username,name,age,balance) values(3,'user3','王五',20,100.00); insert into user(id,username,name,age,balance) values(4,'user4','赵六',20,100.00);
à创建实体类User
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) @Entity public class User implements Serializable{ private static final long serialVersionUID = 1L; @Id@GeneratedValue private long id; //主键. private String username;//用户名. private String name; //姓名 private int age; //年龄. private BigDecimal balance;//余额. }
为什么要加@JsonIgnoreProperties呢?
问题在于,使用load方法,您只需要一个代理,而不是真正的对象。代理对象没有已经加载的属性,所以当序列化发生时,没有要序列化的属性。使用get方法,您实际上可以获得真正的对象,这个对象实际上可以被序列化。
具体可以参考文章:https://my.oschina.net/lieefu/blog/680098
à创建Dao类UserRepository
public interface UserRepository extends JpaRepository<User,Long>{ }
à创建Service类UserService
@Service public class UserService { @Autowired private UserRepository userRepository; public User getById(longid){ return userRepository.getOne(id); } }
à创建Controller类UserController
@RestController public class UserController { @Autowired private UserService userService; @GetMapping("/user/{id}") public User getById(@PathVariablelongid){ User user = userService.getById(id); System.out.println(user); return user; } }
à在src/main/resources新建application.properties
主要是配置端口号和jpa配置:
server.port=7900 spring.jpa.generate-ddl=false spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=none spring.datasource.platform=h2 spring.datasource.schema=classpath:schema.sql spring.datasource.data=classpath:data.sql logging.level.root=INFO logging.level.org.hibernate=INFO
à编写启动类
@SpringBootApplication public class App { public staticv oid main(String[] args) { SpringApplication.run(App.class, args); } }
à启动App测试
启动访问:http://127.0.0.1:7900/user/1 可以在浏览器中看到返回信息:
{"id":1,"username":"user1","name":"张三","age":20,"balance":100.00}
到此服务提供者就编写完毕了,这个代码没有什么特别之处,和我们常规代码编写是一样的!。
(4)服务消费者编码
à新建工程
新建一个服务消费者项目,取名为:microservice-consumer-movice
à在pom.xml添加依赖包
<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> <groupId>com.kfit</groupId> <artifactId>ms-consumer-movice</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>ms-consumer-movice</name> <url>http://maven.apache.org</url> <!-- spring boot parent节点,引入这个之后,在下面和spring boot相关的就不需要引入版本了; --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- web支持: 1、web mvc; 2、restful; 3、jackjson支持; 4、aop ........ --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
à新建实体类User
public class User implements Serializable{ private static final longserialVersionUID = 1L; private long id; //主键. private String username;//用户名. private String name; //姓名 private int age; //年龄. private BigDecimal balance;//余额. }
à新建Controller类MoviceController
@RestController public class MoviceController { @Autowired private RestTemplate restTemplate; @GetMapping("/user/{id}") public User getById(longid){ String url = "http://127.0.0.1:7900/user/"+id; return restTemplate.getForObject(url, User.class); } }
à在src/main/resources新建application.properties
这里只配置了端口号:
server.port=7901
à新建启动类App.java
@SpringBootApplication public class App { @Bean public RestTemplate restTemplate(){ returnnew RestTemplate(); } publicstaticvoid main(String[] args) { SpringApplication.run(App.class, args); } }
这里将RestTemplate进行初始化,交给Spring进行管理。
à启动测试
启动访问:http://127.0.0.1:7901/user/2 ,返回给浏览器信息:
{"id":2,"username":"user2","name":"李四","age":20,"balance":100.00}
(5)存在问题
此例子简单易理解,但是存在很多的问题,比如:
(1)请求地址(http://127.0.0.1:7900/user/)硬编码了;
(2)当有多个提供者节点的时候,怎么进行负载,基本想法可以在提供者和消费者中间加一个反向代理,但是服务太多的时候不利于管理。
相关推荐
SpringCloud分布式微服务项目搭建构造父子模块依赖与实现服务提供者与消费者示例 SpringCloud分布式微服务项目搭建构造父子模块依赖与实现服务提供者与消费者示例 SpringCloud分布式微服务项目搭建构造父子模块依赖...
SpringCloud服务提供者是基于Spring Boot和Spring Cloud构建的一个核心组件,它主要用于实现微服务架构中的服务注册与发现。在微服务系统中,服务提供者是众多独立运行的服务之一,它们各自负责特定业务功能,通过...
本项目"SpringCloud-服务注册与实现-Eureka创建服务提供者示例源码"将深入探讨如何构建一个基于Eureka的服务提供者。 首先,我们需要了解Eureka的基本概念。Eureka由两部分组成:Eureka Server(服务注册中心)和...
SpringCloud ComputeService 是一个基于 Spring Cloud 的服务提供者组件,它是 Spring Cloud 生态系统中的一个重要组成部分,用于构建分布式系统的微服务架构。这个组件的核心目标是为应用程序提供计算资源和服务,...
在本文中,我们将深入探讨如何使用Spring Cloud构建一个服务提供者和消费者的应用程序。Spring Cloud是基于Spring Boot的微服务框架,它简化了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制...
在Spring Cloud项目中,pom.xml会包含Spring Cloud的父POM,以及Eureka Server、服务提供者和服务消费者所需的依赖,如`spring-cloud-starter-netflix-eureka-client`、`spring-cloud-starter-netflix-eureka-server...
在这个名为"SpringCloud消费者服务提供者"的项目中,我们看到涉及到的核心是服务消费者的实现以及与服务提供者的远程通信。 首先,`pom.xml`文件是Maven项目的配置文件,它定义了项目的依赖关系、插件和构建过程。...
服务提供者注册到 Eureka Server,服务消费者通过 Eureka Server 获取服务提供者的地址,实现服务的自动发现。 3. **Zuul**: Zuul 是 Spring Cloud 的边缘服务和动态路由组件,它可以为微服务架构提供动态路由、...
在Spring Cloud的环境中,Feign会自动发现服务提供者的位置(通过Eureka、Consul等服务注册与发现组件),并创建一个代理对象来执行这些方法,实现了透明化的远程调用。 除了基本的HTTP请求,Feign还支持更多的特性...
Eureka是Spring Cloud中的服务发现组件,它允许服务提供者在启动时向Eureka服务器注册,同时服务消费者可以通过Eureka查询到服务提供者的地址。在本项目中,SpringCloud-2.0-eureka-service-10000 就是Eureka服务器...
5. **编写服务消费者**:服务消费者通常会通过SpringCloud的Feign或Ribbon组件来调用服务提供者。编写代码来消费服务提供者的接口。 6. **测试**:通过服务消费者的客户端,调用服务提供者的方法,验证整个流程是否...
在本教程中,我们将深入探讨如何使用SpringCloud 2.0构建服务生产者和服务消费者。SpringCloud是一个基于Spring Boot的微服务开发框架,它提供了一系列的工具,帮助开发者快速搭建分布式系统,包括服务发现、配置...
在Spring Cloud生态系统中,Ribbon...通过这个Ribbon方式的示例,你可以深入理解Spring Cloud服务消费者如何通过Eureka找到服务提供者,并使用Ribbon进行客户端负载均衡。这有助于你构建更加健壮、可扩展的微服务架构。
在Spring Cloud中,我们可以配置服务提供者和服务消费者的配置,指定它们使用的注册中心类型以及相应的配置参数。例如,对于Eureka,我们需要在`application.yml`或`application.properties`中配置Eureka服务器的...
在使用 Ribbon 的时候,服务消费者会在 Eureka 中获取服务提供者的信息,然后利用 Ribbon 进行轮询、随机等策略的负载均衡,从而选择一个合适的服务实例进行请求。 3. **Zuul**:Zuul 是 Spring Cloud 的边缘服务和...
- Eureka 作为服务注册中心的角色,如何实现服务提供者和服务消费者之间的通信。 - 学习服务实例的注册、心跳机制、服务健康检查等概念。 3. **Zuul 和 Ribbon 服务路由与负载均衡**: - 使用 Zuul 实现 API ...
本文将深入探讨基于Spring Cloud的"spring cloud demo"项目,包括消费者、生产者以及注册中心等核心组件,旨在为你提供一个可借鉴的实践案例。 一、Spring Cloud简介 Spring Cloud是一系列框架的集合,它为开发者...
1. **Eureka**: 服务注册与发现,使得服务提供者可以注册自身,消费者可以查找并调用服务。 2. **Zuul/Ribbon**: 作为API网关,处理请求路由、负载均衡等功能。Ribbon是客户端负载均衡器,Zuul则是基于Ribbon实现的...
接下来,我们看看"spring-cloud-alibaba-nacos-consumer"项目,它是服务消费者,负责调用服务提供者的服务。 1. **同样添加依赖**:在消费者项目中,也需要引入相同的Spring Cloud Alibaba Nacos依赖。 2. **配置...
SpringCloud Eureka是服务发现的核心组件,它允许服务提供者注册自身,并使服务消费者能够找到并调用这些服务。开发者需要理解Eureka的工作原理,包括服务注册与发现的过程,以及如何在应用中集成Eureka Server和...