微服務環境搭建

前言:最近在學習關於微服務方面的相關內容,因此寫點本身的實際項目搭建經驗記錄一下,順帶但願能幫助到喜歡這個方面的朋友吧!html

準備工做:
IDE:推薦使用STS,如使用eclipse或者IDEA出現maven引入報錯,請參照報錯,補全缺失包便可!
項目源碼地址:https://github.com/ksuth/MicroService.git
若是沒有github帳號請先註冊~~具體使用方式請參考:http://www.cnblogs.com/shuyuq/p/9243915.html
實在不會就留個郵箱吧~看到了我會發的~~
 
接下來咱們進入正題:
(一)簡單的服務消費項目:
1.構建一個簡單的spring-boot項目:
方式1:使用spring官網構建:https://start.spring.io

保存到本地後,解壓縮導入。
方式二:使用STS構建:直接new個spring-start項目便可。
2.修改pom.xml文件:
<groupId>com.study.springcloud</groupId>
<artifactId>springcloud-ordinary-order-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>springcloud-ordinary-order-service</name>
<description>傳統的訂單服務實例</description>
<!-- 引入spring boot的依賴 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath />
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<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>
<!-- 引入內存數據庫 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 引入spring-boot的maven插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.新增OrderInfo實體類:
@Entity
public class OrderInfo {

//訂單ID
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
//訂單號
@Column
private String orderNo;
//訂單備註
@Column
private String orderRemark;

public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
public String getOrderRemark() {
return orderRemark;
}
public void setOrderRemark(String orderRemark) {
this.orderRemark = orderRemark;
}


}
4.添加Service層接口:
@Repository
public interface OrderService extends JpaRepository<OrderInfo, Long> {


}
5.添加web層入口:
@RestController
public class OrderController {

@Autowired
private OrderService orderService;

@GetMapping("findOrderById/{id}")
public OrderInfo findById(@PathVariable Long id) {
return orderService.findOne(id);
}
}
6.在resource中添加以下配置文件:
  • application.yml
server:
port: 8000
spring:
jpa:
generate-ddl: false
show-sql: true
hibernate:
ddl-auto: none
datasource: # 指定數據源
platform: h2 # 指定數據源類型
schema: classpath:order_schema.sql # 指定h2數據庫的建表腳本
data: classpath:order_data.sql # 指定h2數據庫的數據腳本
logging: # 配置日誌級別,讓hibernate打印出執行的SQL
level:
root: INFO
org.hibernate: INFO
org.hibernate.type.descriptor.sql.BasicBinder: TRACE
org.hibernate.type.descriptor.sql.BasicExtractor: TRACE
  • order_data.sql
insert into order_Info (id, order_No, order_Remark) values (1, '20171111111111', '張三的訂單', );
insert into order_Info (id, order_No, order_Remark) values (2, '20172222222222', '李四的訂單', );
insert into order_Info (id, order_No, order_Remark) values (3, '20173333333333', '王五的訂單', );
  • order_schema.sql
drop table order_Info if exists;
create table order_Info (id bigint generated by default as identity, order_No varchar(50), order_Remark varchar(100), primary key (id));
實現上述操做後可看到項目代碼結構以下:
7.啓動項目:執行項目中main方法
8.檢查結果:
看到這個結果代表服務創建成功。
接下來咱們要創建一個簡單的消費服務來消費剛纔所創建的項目!
 
1.構建簡單的spring-boot項目(方法再也不贅述)
2.修改pom.xml文件:
<groupId>com.study.springcloud</groupId>
<artifactId>springcloud-ordinary-user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>springcloud-ordinary-user-service</name>
<description>傳統的用戶服務實例,作爲消費者使用</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/> 
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 引入內存數據庫 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>


</dependencies>

<!-- 引入Maven插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.新建實體類:
@Entity
public class OrderInfo {

//訂單ID
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
//訂單號
@Column
private String orderNo;
//訂單備註
@Column
private String orderRemark;


public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
public String getOrderRemark() {
return orderRemark;
}
public void setOrderRemark(String orderRemark) {
this.orderRemark = orderRemark;
}


}
4.新建web層消費接口:
@RestController
public class UserController {

@Autowired
private RestTemplate restTemplate;
@GetMapping("/user/findOrderById/{id}")
public OrderInfo findOrderById(@PathVariable Long id){ 
return (OrderInfo) restTemplate.getForEntity("http://localhost:8000/findOrderById/"+id, OrderInfo.class).getBody();
}
}
5.在resource下新增配置文件:
application.yml:
server:
port: 8010
完成後項目結構以下:
此時啓動項目訪問以下路徑:http://localhost:8010//user/findOrderById/2
如實現上圖結果表示消費服務創建成功!
總結:此時咱們能夠看到,咱們成功的在springcloud-ordinary-user-service項目中去使用了springcloud-ordinary-order-service的接口,獲得了咱們想要的結果!這個就是微服務項目的起點~固然這是最簡單的一個,只是讓咱們理解服務於消費是怎麼樣的關係,不能運用於實際工做!接下來咱們繼續!
 
在以前兩項目的基礎之上,咱們如今須要加上微服務的核心:註冊於發現!
讓咱們先來寫一個註冊服務:
項目名稱:springcloud-eureka-server
1.新建spring-boot項目
2.修改pom.xml文件:
<groupId>com.study.springcloud</groupId>
<artifactId>springcloud-eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>springcloud-eureka-server</name>
<description>服務註冊與發現</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath />
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<!-- 引入Spring Cloud Eureka依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 引入spring cloud的依賴 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<!-- 引入Maven插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.在入口處添加以下註解:
@EnableEurekaServer
@SpringBootApplication
public class SpringcloudEurekaServerApplication {

public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaServerApplication.class, args);
}
}
4.添加application.yml配置文件:
server:
port: 8761 # 指定該Eureka實例的端口,默認爲8761
eureka:
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:8761/eureka/
5.項目結構(參照以前的再也不列舉)
6.啓動項目,訪問以下地址:http://localhost:8761/
能夠看到咱們這個簡單的註冊服務功能就實現了~
既然已經有了註冊中心,下一步咱們確定就是對剛纔已經寫好的兩個項目進行改造,將服務註冊到註冊中心上去!
 
(二)基於註冊中心的服務消費項目:
項目名稱:springcloud-order-service
構建項目參照上述內容,需修改內容以下:
1.pom.xml

<groupId>com.study.springcloud</groupId>
<artifactId>springcloud-order-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>springcloud-order-service</name>
<description>訂單服務實例</description>
<!-- 引入spring boot的依賴 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath />
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<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>
<!-- 引入內存數據庫 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 引入Spring Cloud Eureka 客服端依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<!-- 引入spring cloud的依賴 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 引入spring-boot的maven插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2.啓動服務入口處註解添加:
@EnableDiscoveryClient
@SpringBootApplication
public class SpringcloudOrdinaryOrderServiceApplication {

public static void main(String[] args) {
SpringApplication.run(SpringcloudOrdinaryOrderServiceApplication.class, args);
}
}
3.application.yml
server:
port: 8020
spring:
application:
name: springcloud-order-service 
jpa: 
generate-ddl: false
show-sql: true
hibernate:
ddl-auto: none
datasource: # 指定數據源
platform: h2 # 指定數據源類型
schema: classpath:order_schema.sql # 指定h2數據庫的建表腳本
data: classpath:order_data.sql # 指定h2數據庫的數據腳本
logging: # 配置日誌級別,讓hibernate打印出執行的SQL
level:
root: INFO
org.hibernate: INFO
org.hibernate.type.descriptor.sql.BasicBinder: TRACE
org.hibernate.type.descriptor.sql.BasicExtractor: TRACE

eureka:
client:
serviceUrl: 
defaultZone: http://localhost:8761/eureka/
修改完成後結構以下:
啓動服務前,請保證咱們以前寫的註冊中心服務爲啓動狀態!此時咱們能夠在註冊中心看到:
這表示咱們新的服務註冊成功了!
一樣的,咱們能夠將以前的消費服務註冊到註冊中心!項目改造以下:
項目名稱:springcloud-user-service
項目修改:
1.pom.xml
<groupId>com.study.springcloud</groupId>
<artifactId>springcloud-user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>springcloud-user-service</name>
<description>傳統的用戶服務實例,作爲消費者使用</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/> 
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 引入內存數據庫 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>

<!-- 引入Spring Cloud eureka 客服端依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<!-- 引入SpringCloud 依賴 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<!-- 引入Maven插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2.web入口方式修改:
@RestController
public class UserController {

@Autowired
private RestTemplate restTemplate;
@Autowired
private EurekaClient discoveryClient;

public String serviceUrl() {
InstanceInfo instance = discoveryClient.getNextServerFromEureka("SPRINGCLOUD-ORDER-SERVICE", false);
return instance.getHomePageUrl();
}

@GetMapping("/user/findOrderById/{id}")
public OrderInfo findOrderById(@PathVariable Long id){ 
return (OrderInfo) restTemplate.getForEntity(this.serviceUrl()+"/findOrderById/"+id, OrderInfo.class).getBody();
}
}
3.添加註解:
@EnableDiscoveryClient
@SpringBootApplication
public class SpringcloudOrdinaryUserServiceApplication {

@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}

public static void main(String[] args) {
SpringApplication.run(SpringcloudOrdinaryUserServiceApplication.class, args);
}
}
4.application.yml
server:
port: 8030 #設置端口號
spring:
application:
name: springcloud-user-service
eureka: 
client: 
service-url:
defaultZone: http://localhost:8761/eureka/
項目代碼結構與以前相似
完成上述改造後咱們能夠啓動服務,檢查註冊中心以下:
此時咱們能夠看到以前的兩個服務都已經歸入到註冊中心!
咱們訪問消費服務:http://localhost:8030//user/findOrderById/3
 
尾聲:
關於一個簡單的微服務項目搭建就給你們介紹到這裏。GitHub中給出了基於權限驗證的項目代碼,若是對這一塊感興趣的朋友不妨能夠參考下~最後對於微服務項目的高可用作個簡單的介紹,咱們通常的實現方式爲經過啓動兩個註冊中心,相互註冊,實現服務的相互同步來達到高可用的目的~若是有更好的方式歡迎提出來一塊兒探討~
相關文章
相關標籤/搜索