服务消费者 & 提供者
[td]
名词
|
定义
|
服务提供者 | 服务的被调用方(即:为其他服务提供服务的服务) |
服务消费者 | 服务的调用方(即:依赖其他服务的服务) |
Spring Boot/Spring Cloud应用开发套路
-
加依赖
-
加注解
-
写配置
编写服务提供者【用户微服务】
-
<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.itmuch.cloud</groupId>
-
<artifactId>microservice-simple-provider-user</artifactId>
-
<version>0.0.1-SNAPSHOT</version>
-
<packaging>jar</packaging>
-
<!-- 引入spring boot的依赖 -->
-
<parent>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-parent</artifactId>
-
<version>2.0.7.RELEASE</version>
-
</parent>
-
<properties>
-
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-
<java.version>1.8</java.version>
-
</properties>
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-web</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-data-jpa</artifactId>
-
</dependency>
-
<!-- 引入H2数据库,一种内嵌的数据库,语法类似MySQL -->
-
<dependency>
-
<groupId>com.h2database</groupId>
-
<artifactId>h2</artifactId>
-
</dependency>
-
<!-- 引入Lombok -->
-
<dependency>
-
<groupId>org.projectlombok</groupId>
-
<artifactId>lombok</artifactId>
-
<optional>true</optional>
-
</dependency>
-
</dependencies>
-
<!-- 引入spring cloud的依赖,不能少,主要用来管理Spring Cloud生态各组件的版本 -->
-
<dependencyManagement>
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework.cloud</groupId>
-
<artifactId>spring-cloud-dependencies</artifactId>
-
<version>Finchley.SR2</version>
-
<type>pom</type>
-
<scope>import</scope>
-
</dependency>
-
</dependencies>
-
</dependencyManagement>
-
<!-- 添加spring-boot的maven插件,不能少,打jar包时得用 -->
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-maven-plugin</artifactId>
-
</plugin>
-
</plugins>
-
</build>
-
</project>
-
Lombok之前,必须为你的IDE安装Lombok插件!可参考:http://www.cnblogs.com/shindo/p/7550790.html
-
Lombok官方网站:https://projectlombok.org/
-
@Entity
-
@Data
-
@NoArgsConstructor
-
@AllArgsConstructor
-
public class User {
-
@Id
-
@GeneratedValue(strategy = GenerationType.AUTO)
-
private Long id;
-
@Column
-
private String username;
-
@Column
-
private String name;
-
@Column
-
private Integer age;
-
@Column
-
private BigDecimal balance;
-
}
-
@Repository
-
public interface UserRepository extends JpaRepository<User, Long> {
-
}
-
@RequestMapping("/users")
-
@RestController
-
public class UserController {
-
@Autowired
-
private UserRepository userRepository;
-
@GetMapping("/{id}")
-
public Optional<User> findById(@PathVariable Long id) {
-
return this.userRepository.findById(id);
-
}
-
}
-
@SpringBootApplication
-
public class ProviderUserApplication {
-
public static void main(String[] args) {
-
SpringApplication.run(ProviderUserApplication.class, args);
-
}
-
/**
-
* 初始化用户信息
-
* 注:Spring Boot2不能像1.x一样,用spring.datasource.schema/data指定初始化SQL脚本,否则与actuator不能共存
-
* 原因详见:
-
*
-
* @param repository repo
-
* @return runner
-
*/
-
@Bean
-
ApplicationRunner init(UserRepository repository) {
-
return args -> {
-
User user1 = new User(1L, "account1", "张三", 20, new BigDecimal(100.00));
-
User user2 = new User(2L, "account2", "李四", 28, new BigDecimal(180.00));
-
User user3 = new User(3L, "account3", "王五", 32, new BigDecimal(280.00));
-
Stream.of(user1, user2, user3)
-
.forEach(repository::save);
-
};
-
}
-
}
-
server:
-
# 指定Tomcat端口
-
port: 8000
-
spring:
-
jpa:
-
# 让hibernate打印执行的SQL
-
show-sql: true
-
logging:
-
level:
-
root: INFO
-
# 配置日志级别,让hibernate打印出执行的SQL参数
-
org.hibernate: INFO
-
org.hibernate.type.descriptor.sql.BasicBinder: TRACE
-
org.hibernate.type.descriptor.sql.BasicExtractor: TRACE
-
server.port=8000
-
spring.jpa.show-sql=true
-
logging.level.root=INFO
-
logging.level.org.hibernate=INFO
-
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
-
logging.level.org.hibernate.type.descriptor.sql.BasicExtractor=TRACE
测试
-
{"id":1,"username":"account1","name":"张三","age":20,"balance":100.00}
编写服务消费者【电影微服务】
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-web</artifactId>
-
</dependency>
-
@Data
-
@AllArgsConstructor
-
@NoArgsConstructor
-
public class User {
-
private Long id;
-
private String username;
-
private String name;
-
private Integer age;
-
private BigDecimal balance;
-
}
-
@SpringBootApplication
-
public class ConsumerMovieApplication {
-
@Bean
-
public RestTemplate restTemplate() {
-
return new RestTemplate();
-
}
-
public static void main(String[] args) {
-
SpringApplication.run(ConsumerMovieApplication.class, args);
-
}
-
}
-
@RequestMapping("/movies")
-
@RestController
-
public class MovieController {
-
@Autowired
-
private RestTemplate restTemplate;
-
@GetMapping("/users/{id}")
-
public User findById(@PathVariable Long id) {
-
// 这里用到了RestTemplate的占位符能力
-
User user = this.restTemplate.getForObject("http://localhost:8000/users/{id}", User.class, id);
-
// ...电影微服务的业务...
-
return user;
-
}
-
}
-
server:
-
port: 8010
测试
-
{"id":1,"username":"account1","name":"张三","age":20,"balance":100.00}
存在的问题
你可能会质疑:用户微服务地址为什么会变,让它保持不变就行了啊,这不是问题。这里举两个例子:例1:如果你用Docker,那么地址几乎每次启动都会变……例2:你之前用的是TXYun,后来你想把用户微服务迁移到Aliyun。这个时候IP就会发生变化。我相信你不会乐意找到哪些服务调用了用户微服务的接口,然后所有调用用户微服务的服务统一修改地址……
配套代码
-
https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-simple-provider-user
-
https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-simple-consumer-movie
-
https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-simple-provider-user
-
https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-simple-consumer-movie
更多免费技术资料可关注:annalin1203