最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud如何創(chuàng)建一個(gè)服務(wù)提供者provider

 更新時(shí)間:2018年07月04日 09:40:01   作者:Ryan Miao  
這篇文章主要介紹了SpringCloud如何創(chuàng)建一個(gè)服務(wù)提供者provider,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

前幾篇主要集中在注冊中心eureka的使用上,接下來可以創(chuàng)建服務(wù)提供者provider來注冊到eureka。

demo源碼見: https://github.com/Ryan-Miao/spring-cloud-Edgware-demo/tree/master/provider-demo

為了方便版本控制,接下來的項(xiàng)目都是基于https://github.com/Ryan-Miao/spring-cloud-Edgware-demo 這個(gè)parent配置的。

創(chuàng)建子moudle provider-demo

創(chuàng)建一個(gè)子module,項(xiàng)目名叫provider-demo. 填充springboot和springcloud依賴

<dependencies>
  <!--springboot 依賴start-->
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
   <optional>true</optional>
  </dependency>
  <dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jsr310</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-eureka</artifactId>
  </dependency>
  <!--springboot 依賴結(jié)束-->


  <dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger2</artifactId>
  </dependency>
  <dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger-ui</artifactId>
  </dependency>


  <!--工具類 start-->
  <dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
  </dependency>
  <dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <optional>true</optional>
  </dependency>

  <dependency>
   <groupId>net.logstash.logback</groupId>
   <artifactId>logstash-logback-encoder</artifactId>
  </dependency>
  <!--工具類end-->


 </dependencies>

spring-boot-starter-web 提供web能力,必須spring-boot-starter-actuator 提供項(xiàng)目統(tǒng)計(jì)和基礎(chǔ)的監(jiān)控endpoint, 想要使用spring-boot-admin監(jiān)控就必須添加了 spring-boot-devtools 開發(fā)模式 jackson-datatype-jsr310 可以解決Java8新的時(shí)間APILocalDate解體 spring-cloud-starter-eureka eureka客戶端,負(fù)責(zé)維護(hù)心跳和注冊 swagger 提供Restful契約 lombok 看起來很清爽的編譯級別getter setter工具 guava 大而全的Java必備類庫 logstash-logback-encoder 想要收集日志到ELK,使用這個(gè)appender

啟動(dòng)類

@EnableDiscoveryClient
@SpringBootApplication
public class ProviderDemoApplication {

  public static void main(String[] args) {
    SpringApplication.run(ProviderDemoApplication.class, args);
  }

}

@EnableDiscoveryClient 來啟用服務(wù)注冊

這個(gè)ProviderDemoApplication應(yīng)該放置于項(xiàng)目包的最外層,因?yàn)锧SpringbootAppliatin包含了@ComponentScan的注解,默認(rèn)掃描本類包下,否則必須手動(dòng)指定scan。

Swagger

swagger就是一個(gè)配置類

@EnableSwagger2
@Configuration
public class SwaggerConfiguration {

  private ApiInfo apiInfo() {
    return new ApiInfoBuilder()
      .title("服務(wù)提供者 API")
      .description("提供用戶信息查詢")
      .termsOfServiceUrl("")
      .version("1.0.0")
      .build();
  }

  /**
   * 定義api配置.
   */
  @Bean
  public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2)
      .select()
      .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
      .build()
      .apiInfo(apiInfo());
  }

}

對于swagger頁面的路由,需要我們來引導(dǎo)下:

創(chuàng)建一個(gè)controller來導(dǎo)航

@Controller
public class HomeController {
  @GetMapping(value = {"/api", "/"})
  public String api() {
    return "redirect:/swagger-ui.html";
  }

}

來一個(gè)Controller 接口

@Api
@RestController
@RequestMapping("/api/v1/users")
public class UserController{

  private List<User> users = Lists.newArrayList(
    new User(1, "譚浩強(qiáng)", 100, LocalDate.now()),
    new User(2, "嚴(yán)蔚敏", 120, LocalDate.now()),
    new User(3, "譚浩強(qiáng)", 100, LocalDate.now()),
    new User(4, "James Gosling", 150, LocalDate.now()),
    new User(6, "Doug Lea", 150, LocalDate.now())
  );

  @GetMapping("/")
  public List<UserVo> list() {
    return users.stream()
      .map(u -> new UserVo(u.getId(), u.getName(), u.getAge(), u.getBirth()))
      .collect(Collectors.toList());
  }
}

一些簡單的環(huán)境配置

application.yml

spring:
 application:
  name: provider-demo
 jackson:
  serialization:
   WRITE_DATES_AS_TIMESTAMPS: false
  default-property-inclusion: non_null

#服務(wù)過期時(shí)間配置,超過這個(gè)時(shí)間沒有接收到心跳EurekaServer就會(huì)將這個(gè)實(shí)例剔除
#注意,EurekaServer一定要設(shè)置eureka.server.eviction-interval-timer-in-ms否則這個(gè)配置無效,這個(gè)配置一般為服務(wù)刷新時(shí)間配置的三倍
#默認(rèn)90s
eureka.instance.lease-expiration-duration-in-seconds: 15
#服務(wù)刷新時(shí)間配置,每隔這個(gè)時(shí)間會(huì)主動(dòng)心跳一次
#默認(rèn)30s
eureka.instance.lease-renewal-interval-in-seconds: 5

server:
 port: 8082


springfox:
 documentation:
  swagger:
   v2:
    path: /swagger-resources/api-docs

log:
 path: logs

application-dev.yml

management:
 security:
  enabled: false
eureka:
 client:
  serviceUrl:
   defaultZone: http://localhost:8761/eureka/


logstash:
 url: localhost:4560

這里需要提一點(diǎn),由于我集成了logstash, 所以必須安裝好logstash, 見ELK入門使用。 當(dāng)然可以跳過,只要不提供logback.xml的配置就行,把依賴中l(wèi)ogstash移除即可。

Log配置

默認(rèn)采用logback作為日志框架,簡單配置如下,對于不想使用logstash的,移除logstash的appender即可。

在resource下新建logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

 <springProperty scope="context" name="appName" source="spring.application.name"
  defaultValue="unknown"/>
 <springProperty scope="context" name="log.path" source="log.path"
  defaultValue="logs"/>
 <springProperty scope="context" name="logstashurl" source="logstash.url"
  defaultValue="localhost:4560"/>

 <include resource="org/springframework/boot/logging/logback/base.xml"/>
 <!--輸出到控制臺(tái)-->
 <appender name="console" class="ch.qos.logback.core.ConsoleAppender">LoggingInterceptor

  <encoder>
   <pattern>%d{HH:mm:ss.SSS} %X{req.remoteHost} %X{req.requestURI}
    ${appName} [%thread] %-5level %logger{36} - %msg%n
   </pattern>
  </encoder>
 </appender>

 <!--輸出到文件-->
 <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
   <fileNamePattern>${log.path}/${appName}.%d{yyyy-MM-dd}.log</fileNamePattern>
  </rollingPolicy>
  <encoder>
   <pattern>%d{HH:mm:ss.SSS} ${appName} %X{req.remoteHost} %X{req.requestURI}
    %X{req.userAgent}
    %X{req.method} - [%thread] %-5level %logger{36} - %msg%n
   </pattern>
  </encoder>
 </appender>

 <!-- 輸出到logstash-->
 <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
  <destination>${logstashurl}</destination>
  <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
 </appender>


 <springProfile name="dev">
  <root level="info">
   <appender-ref ref="console"/>
   <appender-ref ref="file"/>
   <appender-ref ref="LOGSTASH"/>
  </root>

 </springProfile>
 <springProfile name="test, prod">
  <root level="info">
   <appender-ref ref="file"/>
   <appender-ref ref="LOGSTASH"/>
  </root>
 </springProfile>
</configuration>

啟動(dòng)

確保eureka已啟動(dòng),admin最好也啟動(dòng),方便查看app狀態(tài),ELK的日志系統(tǒng)也最好可以使用。當(dāng)然,只有eureka是剛需。

編譯打包

mvn clean install package spring-boot:repackage

運(yùn)行main方法,指定profile為dev, 可以在idea中編輯運(yùn)行配置,添加參數(shù)

--spring.profiles.active=dev

或者命令行jar啟動(dòng)

復(fù)制代碼 代碼如下:
java -Xms256m -Xmx1g -XX:+UseG1GC -jar ./target/provider-demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

啟動(dòng)后,訪問eureka

訪問admin

訪問provider-demo

 

暴露我們的API給consumer

既然有服務(wù)提供者,必然是為了consumer消費(fèi)。consumer應(yīng)該如何消費(fèi)?手動(dòng)調(diào)用這個(gè)http請求即可。前面提到swagger Restful契約,就是服務(wù)提供者提供請求訪問的參數(shù)和要求。consumer如果手動(dòng)去開發(fā)這個(gè)client必然耗時(shí),而且容易出錯(cuò)。所以,作為服務(wù)提供者,理應(yīng)提供sdk或者client給consumer來用。

在spring cloud技術(shù)體系中,遠(yuǎn)程調(diào)用自然是重中之重。目前我找到的具體用法為Feign+Ribbon+Hystrix.

通過Feign的聲明式接口對接,實(shí)現(xiàn)了consumer對provider的調(diào)用。ribbon客戶端負(fù)載均衡,hystrix作健康熔斷。

在這里,我們就首先要提供Feign的接口了。

把controller的api提煉成一個(gè)接口。首先,我們創(chuàng)建一個(gè)新的項(xiàng)目

https://github.com/Ryan-Miao/spring-cloud-Edgware-demo/tree/master/provider-api

將這個(gè)項(xiàng)目放到provider-demo的依賴列表里

<!--內(nèi)部依賴-->
<dependency>
 <groupId>com.test</groupId>
 <artifactId>provider-api</artifactId>
 <version>0.0.1-SNAPSHOT</version>
</dependency>
<!--內(nèi)部依賴end-->

抽離UserApi接口道provider-api項(xiàng)目中

@RequestMapping("/api/v1/users")
public interface UserApi {

  @GetMapping("/")
  List<UserVo> list();
}

在provider-demo的controller里改造如下

@Api
@RestController
public class UserController implements UserApi {

  private List<User> users = Lists.newArrayList(
    new User(1, "譚浩強(qiáng)", 100, LocalDate.now()),
    new User(2, "嚴(yán)蔚敏", 120, LocalDate.now()),
    new User(3, "譚浩強(qiáng)", 100, LocalDate.now()),
    new User(4, "James Gosling", 150, LocalDate.now()),
    new User(6, "Doug Lea", 150, LocalDate.now())
  );

  @Override
  public List<UserVo> list() {
    return users.stream()
      .map(u -> new UserVo(u.getId(), u.getName(), u.getAge(), u.getBirth()))
      .collect(Collectors.toList());
  }
}

這樣,controller沒有變化,只是被抽離了api路徑。而獨(dú)立出來的module provider-api就是我們給consumer提供的client。下一節(jié)使用consumer消費(fèi)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SprinBoot如何集成參數(shù)校驗(yàn)Validator及參數(shù)校驗(yàn)的高階技巧

    SprinBoot如何集成參數(shù)校驗(yàn)Validator及參數(shù)校驗(yàn)的高階技巧

    這篇文章主要介紹了SprinBoot如何集成參數(shù)校驗(yàn)Validator及參數(shù)校驗(yàn)的高階技巧包括自定義校驗(yàn)、分組校驗(yàn),本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Java Http請求傳json數(shù)據(jù)亂碼問題的解決

    Java Http請求傳json數(shù)據(jù)亂碼問題的解決

    這篇文章主要介紹了Java Http請求傳json數(shù)據(jù)亂碼問題的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 深入Java萬物之母Object類詳情

    深入Java萬物之母Object類詳情

    這篇文章主要介紹了Java萬物之母Object類詳情,Object類,它是所有類的默認(rèn)父類 ,子類不用使用extends關(guān)鍵字繼承它,不管是JDK中的類,還是自定義的類
    2022-06-06
  • 在jmeter的beanshell中用java獲取系統(tǒng)當(dāng)前時(shí)間的簡單實(shí)例

    在jmeter的beanshell中用java獲取系統(tǒng)當(dāng)前時(shí)間的簡單實(shí)例

    這篇文章介紹了在jmeter的beanshell中用java獲取系統(tǒng)當(dāng)前時(shí)間的簡單實(shí)例,有需要的朋友可以參考一下
    2013-09-09
  • Java增強(qiáng)for循環(huán)的增刪操作代碼

    Java增強(qiáng)for循環(huán)的增刪操作代碼

    Foreach循環(huán)(Foreach loop)是計(jì)算機(jī)編程語言中的一種控制流程語句,通常用來循環(huán)遍歷數(shù)組或集合中的元素,本文通過實(shí)例演示普通for循環(huán)和foreach循環(huán)使用,java增強(qiáng)for循環(huán)的操作代碼感興趣的朋友一起看看吧
    2024-02-02
  • java求整數(shù)的位數(shù)方式

    java求整數(shù)的位數(shù)方式

    這篇文章主要介紹了java求整數(shù)的位數(shù)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java實(shí)戰(zhàn)之基于I/O流設(shè)計(jì)的圖書管理系統(tǒng)

    Java實(shí)戰(zhàn)之基于I/O流設(shè)計(jì)的圖書管理系統(tǒng)

    這篇文章主要介紹了Java實(shí)戰(zhàn)之基于I/O流設(shè)計(jì)的圖書館管理系統(tǒng),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 使用Spring框架實(shí)現(xiàn)用戶登錄

    使用Spring框架實(shí)現(xiàn)用戶登錄

    這篇文章主要為大家詳細(xì)介紹了使用Spring框架實(shí)現(xiàn)用戶登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • SpringBoot2.x集成Dozer的示例代碼

    SpringBoot2.x集成Dozer的示例代碼

    本文主要介紹了SpringBoot2.x集成Dozer的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 關(guān)于@Valid注解大全以及用法規(guī)范

    關(guān)于@Valid注解大全以及用法規(guī)范

    這篇文章主要介紹了關(guān)于@Valid注解大全以及用法規(guī)范,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論

旬邑县| 宁强县| 万源市| 敦煌市| 琼结县| 平南县| 融水| 札达县| 玉环县| 渭南市| 宁国市| 华坪县| 壶关县| 遂平县| 乌什县| 新乡县| 全州县| 富川| 开化县| 云浮市| 广汉市| 大兴区| 博客| 宽城| 孝义市| 应用必备| 高密市| 文登市| 化州市| 论坛| 华坪县| 武冈市| 潢川县| 广汉市| 中牟县| 大姚县| 乌什县| 博乐市| 白城市| 天峻县| 唐海县|