摘要:下一篇介紹基于的服務注冊與調用。服務提供者工程配置這里服務提供者是使用之前進階教程第三篇整合連接池以及監控改造而來,這里一樣的部分就不再重復說明,下面將說明新增的部分。
Spring Cloud簡介
Spring Cloud是一個基于Spring Boot實現的云應用開發工具,它為基于JVM的云應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分布式會話和集群狀態管理等操作提供了一種簡單的開發方式。
Spring Cloud包含了多個子項目(針對分布式系統中涉及的多個不同開源產品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等項目。
微服務架構“微服務架構”在這幾年非常的火熱,以至于關于微服務架構相關的開源產品被反復的提及(比如: netflix、dubbo),Spring Cloud也因Spring社區的強大知名度和影響力也被廣大架構師與開發者備受關注。
那么什么是“微服務架構”呢?簡單的說,微服務架構就是將一個完整的應用從數據存儲開始垂直拆分成多個不同的服務,每個服務都能獨立部署、獨立維護、獨立擴展,服務與服務間通過諸如RESTful API的方式互相調用。
對于“微服務架構”,大家在互聯網可以搜索到很多相關的介紹和研究文章來進行學習和了解。也可以閱讀始祖Martin Fowler的《Microservices》(中文版翻譯點擊查看),本文不做更多的介紹和描述。
服務治理在簡單介紹了Spring Cloud和微服務架構之后,下面回歸本文的主旨內容,如何使用Spring Cloud來實現服務治理。
由于Spring Cloud為服務治理做了一層抽象接口,所以在Spring Cloud應用中可以支持多種不同的服務治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服務治理抽象層的作用下,我們可以無縫地切換服務治理實現,并且不影響任何其他的服務注冊、服務發現、服務調用等邏輯。
所以,下面我們通過Eureka這種種服務治理的實現來體會Spring Cloud這一層抽象所帶來的好處。
下一篇介紹基于Consul的服務注冊與調用。
首先,我們來嘗試使用Spring Cloud Consul來實現服務治理。
Consul 是一套開源的分布式服務發現和配置管理系統,由 HashiCorp 公司用 Go 語言開發。
它具有很多優點。包括: 基于 raft 協議,比較簡潔; 支持健康檢查, 同時支持 HTTP 和 DNS 協議 支持跨數據中心的 WAN 集群 提供圖形界面 跨平臺,支持 Linux、Mac、Windows
下面,就來具體看看如何使用Spring Cloud Consul實現服務治理,這里使用Consul為服務注冊中心工程、consul-provider服務提供者工程、consul-consumer服務消費者工程。
準備工作環境:
windows jdk 8 maven 3.0 IDEA構建工程
首先構建父工程,引入父工程依賴:
4.0.0 cn.zhangbox spring-cloud-study 1.0-SNAPSHOT cn.zhangbox spring-cloud-consul pom 1.0-SNAPSHOT consul-provider consul-consumer
父工程取名為:spring-cloud-consul
構建子工程,分別創建工程名為:、consul-provider、consul-consumer并在pom中加入以下依賴:
4.0.0 cn.zhangbox spring-cloud-consul 1.0-SNAPSHOT cn.zhangbox consul-provider 0.0.1-SNAPSHOT jar consul-provider this project for Spring Boot UTF-8 UTF-8 1.8 3.4 1.10 1.2.0 1.16.14 1.2.41 1.1.2 aliyunmaven http://maven.aliyun.com/nexus/content/groups/public/ org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis-spring-boot.version} org.springframework.cloud spring-cloud-starter-consul-discovery org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-starter-web io.springfox springfox-swagger2 2.6.1 io.springfox springfox-swagger-ui 2.6.1 mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-test test org.apache.commons commons-lang3 ${commons-lang3.version} commons-codec commons-codec ${commons-codec.version} com.alibaba fastjson ${fastjson.version} com.alibaba druid-spring-boot-starter ${druid.version} org.projectlombok lombok ${lombok.version} org.springframework.cloud spring-cloud-dependencies Dalston.SR1 pom import eureka-provider org.springframework.boot spring-boot-maven-plugin
4.0.0 cn.zhangbox spring-cloud-consul 1.0-SNAPSHOT cn.zhangbox consul-consumer 0.0.1-SNAPSHOT jar consul-consumer this project for Spring Boot UTF-8 UTF-8 1.8 3.4 1.10 1.2.0 1.16.14 1.2.41 1.1.2 aliyunmaven http://maven.aliyun.com/nexus/content/groups/public/ org.springframework.cloud spring-cloud-starter-consul-discovery org.springframework.boot spring-boot-starter-actuator org.springframework.cloud spring-cloud-starter-feign org.springframework.boot spring-boot-starter-web io.springfox springfox-swagger2 2.6.1 io.springfox springfox-swagger-ui 2.6.1 org.springframework.boot spring-boot-starter-test test org.apache.commons commons-lang3 ${commons-lang3.version} commons-codec commons-codec ${commons-codec.version} com.alibaba fastjson ${fastjson.version} org.projectlombok lombok ${lombok.version} org.springframework.cloud spring-cloud-dependencies Dalston.SR1 pom import eureka-provider org.springframework.boot spring-boot-maven-plugin
工程構建完成。
服務注冊中心搭建Window下安裝:
window下安裝Consul
Linux下安裝:
CentOS 安裝 Consul 服務注冊和發現軟件
Consul安裝 linux環境
至此consul注冊中心創建完成,window下本機安裝的consul瀏覽器輸入地址:http://localhost:8500
linux下安裝的只需要把localhost換成對應的ip即可
可以看到如下頁面,表示服務啟動OK
這里這看到還沒有服務暴露出來,是因為還沒創建服務提供者工程。
這里服務提供者是使用之前SpringBoot進階教程 | 第三篇:整合Druid連接池以及Druid監控改造而來,這里一樣的部分就不再重復說明,下面將說明新增的部分。
首先:修改application.yml配置為如下:
#公共配置 server: port: 80 tomcat: uri-encoding: UTF-8 spring: application: name: consul-provider #激活哪一個環境的配置文件 profiles: active: dev #連接池配置 datasource: driver-class-name: com.mysql.jdbc.Driver # 使用druid數據源 type: com.alibaba.druid.pool.DruidDataSource druid: # 配置測試查詢語句 validationQuery: SELECT 1 FROM DUAL # 初始化大小,最小,最大 initialSize: 10 minIdle: 10 maxActive: 200 # 配置一個連接在池中最小生存的時間,單位是毫秒 minEvictableIdleTimeMillis: 180000 testOnBorrow: false testWhileIdle: true removeAbandoned: true removeAbandonedTimeout: 1800 logAbandoned: true # 打開PSCache,并且指定每個連接上PSCache的大小 poolPreparedStatements: true maxOpenPreparedStatements: 100 # 配置監控統計攔截的filters,去掉后監控界面sql無法統計,"wall"用于防火墻 filters: stat,wall,log4j # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 #配置consul獲取服務地址,這里使用的是本地提供的注冊中心 cloud: consul: #consul服務地址 host: localhost #consul端口號 port: 8500 discovery: #配置注冊中心顯示當前服務的ip prefer-ip-address: true #配置當前服務的ip和端口號 #instance-id: ${spring.cloud.client.ipAddress}:${server.port} #配置該項點擊ip會跳轉至對應的接口swagger頁面 health-check-url: http://${spring.cloud.client.ipAddress}:${server.port}/swagger-ui.html # ${server.port}為該服務的端口號 #mybatis mybatis: # 實體類掃描 type-aliases-package: cn.zhangbox.springboot.entity # 配置映射文件位置 mapper-locations: classpath:mapper/*.xml # 開啟駝峰匹配 mapUnderscoreToCamelCase: true --- #開發環境配置 server: #端口 port: 8080 spring: profiles: dev # 數據源配置 datasource: url: jdbc:mysql://101.132.66.175:3306/student?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true username: root password: 123456 #日志 logging: config: classpath:log/logback.xml path: log/consul-provider --- #測試環境配置 server: #端口 port: 80 spring: profiles: test # 數據源配置 datasource: url: jdbc:mysql://127.0.0.1:3306/consul-provider?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true username: root password: 123456 #日志 logging: config: classpath:log/logback.xml path: /home/log/consul-provider --- #生產環境配置 server: #端口 port: 8080 spring: profiles: prod # 數據源配置 datasource: url: jdbc:mysql://127.0.0.1:3306/consul-provider?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true username: root password: 123456 #日志 logging: config: classpath:log/logback.xml path: /home/log/consul-provider
其次:在config目錄下增加SwaggerConfig類加入以下代碼:
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket userApi() { Docket docket = new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("cn.zhangbox.eureka.provider.controller"))//過濾的接口,有這掃描才會看到接口信息 .paths(PathSelectors.any()) .build(); return docket; } private ApiInfo apiInfo() { return new ApiInfoBuilder().title("eureka服務端提供者接口平臺").description("服務相關數據接口") .termsOfServiceUrl("http://www.zhang.box.cn/").contact("技術開發部") .license("Licence Version 1.0").licenseUrl("#").version("1.0").build(); } }
這里如果不會使用swagger的整合可以參考這篇文章:
SpringBoot非官方教程 | 第十一篇:SpringBoot集成swagger2,構建優雅的Restful API
接著:創建核心啟動類:
@EnableDiscoveryClient //使用該注解將注冊服務到consul @SpringBootApplication @MapperScan("cn.zhangbox.consul.provider.dao")//配置mybatis接口包掃描 public class ConsulProviderApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(ConsulProviderApplication.class, args); } }
至此consul-provider服務提供者創建完成,瀏覽器輸入地址:http://localhost:8500/
可以看到如下頁面,表示服務注冊OK
瀏覽器輸入地址:http://localhost:8080/swagger-ui.html后可以跳轉看到swagger的頁面并可是測試服務提供者的接口,如下:
這里構建的工程名為consul-consumer,上文已經構建了工程但是沒有創建目錄,這里只需要在java目錄下創建config、controller,service,包即可,這里服務的消費是通過feign來進行服務調用的,后面會有專門以篇文章來講feign。
首先:在consul-consumer工程下resource目錄下添加application.yml文件并加入以下配置:
#公共配置 server: port: 80 tomcat: uri-encoding: UTF-8 spring: #服務名稱,更關鍵,使用feign進行服務消費將以此為依據 application: name: consul-consumer #激活哪一個環境的配置文件 profiles: active: dev #配置consul獲取服務地址,這里使用的是本地提供的注冊中心 cloud: consul: #consul服務地址 host: localhost #consul端口號 port: 8500 discovery: #配置注冊中心顯示當前服務的ip prefer-ip-address: true #配置當前服務的ip和端口號 #instance-id: ${spring.cloud.client.ipAddress}:${server.port} #配置該項點擊ip會跳轉至對應的接口swagger頁面 health-check-url: http://${spring.cloud.client.ipAddress}:${server.port}/swagger-ui.html # ${server.port}為該服務的端口號 --- #開發環境配置 server: #端口 port: 8081 spring: profiles: dev #日志 logging: config: classpath:log/logback.xml path: log/consul-consumer --- #測試環境配置 server: #端口 port: 8082 spring: profiles: test #日志 logging: config: classpath:log/logback.xml path: /home/log/consul-consumer --- #生產環境配置 server: #端口 port: 8083 spring: profiles: prod #日志 logging: config: classpath:log/logback.xml path: /home/log/consul-consumer
其次:在config目錄下增加SwaggerConfig類加入以下代碼:
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket userApi() { Docket docket = new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("cn.zhangbox.eureka.consumer.controller"))//過濾的接口,有這掃描才會看到接口信息 .paths(PathSelectors.any()) .build(); return docket; } private ApiInfo apiInfo() { return new ApiInfoBuilder().title("eureka服務端消費者接口平臺").description("服務相關數據接口") .termsOfServiceUrl("http://www.zhang.box.cn/").contact("技術開發部") .license("Licence Version 1.0").licenseUrl("#").version("1.0").build(); } }
接著:在service包下創建StudentConsumerService類并加入以下代碼:
@FeignClient(value = "consul-provider") public interface StudentConsumerService { /** * 查詢所有的學生信息 * * @param sname * @param age * @return */ @RequestMapping(value = "/student/list",method = RequestMethod.GET) String getStudentList(@RequestParam(value = "sname") String sname, @RequestParam(value = "age") Integer age); }
然后:在controller包下創建StudentConteroller并加入如下代碼:
@Controller @RequestMapping("/student") @Api(value = "eureka-consumer", description = "學生查詢接口") public class StudentConteroller { private static final Logger LOGGER = LoggerFactory.getLogger(StudentConteroller.class); @Autowired StudentConsumerService studentService; /** * 查詢所有的學生信息 * * @param sname * @param age * @param modelMap * @return */ @ResponseBody @GetMapping("/consumer/list") public String list( @ApiParam(value = "學生姓名") @RequestParam(required = false) String sname, @ApiParam(value = "年齡") @RequestParam(required = false) Integer age, ModelMap modelMap) { String json = null; try { json = studentService.getStudentList(sname, age); } catch (Exception e) { e.printStackTrace(); modelMap.put("ren_code", "0"); modelMap.put("ren_msg", "查詢失敗===>" + e); LOGGER.error("查詢失敗===>" + e); json = JSON.toJSONString(modelMap); } return json; } }
接著:創建核心啟動類:
@EnableFeignClients//開啟Feign調用接口 @EnableDiscoveryClient//開啟客戶端服務,沒有這個注解會報Feign找不到對應服務的錯誤 @SpringBootApplication public class ConsulConsumerApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(EurekaConsumerApplication.class, args); } }
至此consul-consumer服務提供者創建完成,瀏覽器輸入地址:http://127.0.0.1:8081/swagger-ui.html
consul注冊中心可以看到服務提供和消費者都在:
跳轉看到swagger的頁面并可是測試服務消費者的接口,可以看到如下頁面,并點擊try it out按鈕,返回了正確的學生信息數據
返回數據如下:
{ "ren_code": "0", "ren_msg": "查詢成功", "studentList": [{ "age": "17", "birth": "2010-07-22", "dept": "王同學學習成績很不錯", "sex": "1", "sname": "王同學", "sno": 1 }, { "age": "17", "birth": "2010-07-22", "dept": "李同學學習成績很不錯", "sex": "1", "sname": "李同學", "sno": 2 }] }
以上就是spring cloud基于consul實現分布式服務注冊與消費的整合流程,是不是很簡單,你也來小試牛刀一把吧。
源碼地址SpringCloud核心教程 | 第四篇:服務注冊與發現 Consul篇
寫在最后歡迎關注、喜歡、和點贊后續將推出更多的spring cloud教程,敬請期待。
歡迎關注我的微信公眾號獲取更多更全的學習資源,視頻資料,技術干貨!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76721.html
摘要:是一個相對比較新的微服務框架,年才推出的版本雖然時間最短但是相比等框架提供的全套的分布式系統解決方案。提供線程池不同的服務走不同的線程池,實現了不同服務調用的隔離,避免了服務器雪崩的問題。通過互相注冊的方式來進行消息同步和保證高可用。 Spring Cloud 是一個相對比較新的微服務框架,...
摘要:為了保證其高可用,單個服務又必須集群部署。為了解決這個問題,就出現斷路器模型。一斷路器簡介摘自官網已經創建了一個名為的庫來實現斷路器模式。較底層的服務如果出現故障,會導致連鎖故障。當對特定的服務的調用達到一個閥值是秒次斷路器將會被打開。 轉載請標明出處: http://blog.csdn.net/forezp/a...本文出自方志朋的博客 在微服務架構中,我們將業務拆分成一個個的服務,...
摘要:我沒有能力去控制那些自媒體發布這些不實的內容,但是在我了解的范圍內,還是盡力輸出一些我的理解。 之前我發過一篇《說說我為什么看好Spring Cloud Alibaba》,然后這兩天有網友給我轉了這篇文章《坑爹項目spring-cloud-alibaba,我們也來一個》,問我的看法是怎么樣的,聊天時候簡單說了一下。今天在家休息,抽空整理一下內容,逐點說一下我的看法,主要還是覺得這篇文章...
閱讀 1294·2021-10-08 10:05
閱讀 4107·2021-09-22 15:54
閱讀 3105·2021-08-27 16:18
閱讀 3106·2019-08-30 15:55
閱讀 1435·2019-08-29 12:54
閱讀 2748·2019-08-26 11:42
閱讀 543·2019-08-26 11:39
閱讀 2128·2019-08-26 10:11