服務消費者 & 提供者
[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