• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

SpringCloud如何创建一个服务提供者provider

java 搞代码 4年前 (2022-01-05) 22次浏览 已收录 0个评论

这篇文章主要介绍了SpringCloud如何创建一个服务提供者provider,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

前几篇主要集中在注册中心eureka的使用上,接下来可以创建服务提供者provider来注册到eureka。

demo源码见:

为了方便版本控制,接下来的项目都是基于https://github.com/Ryan-Miao/spring-cloud-Edgware-demo 这个parent配置的。

创建子moudle provider-demo

创建一个子module,项目名叫provider-demo. 填充springboot和springcloud依赖

  <!--springboot 依赖start--> org.springframework.bootspring-boot-starter-web org.springframework.bootspring-boot-starter-actuator org.springframework.bootspring-boot-devtoolstrue com.fasterxml.jackson.datatypejackson-datatype-jsr310 org.springframework.cloudspring-cloud-starter-eureka<!--springboot 依赖结束--> io.springfoxspringfox-swagger2 io.springfoxspringfox-swagger-ui<!--工具类 start--> com.google.guavaguava org.projectlomboklomboktrue net.logstash.logbacklogstash-logback-encoder<!--工具类end-->

spring-boot-starter-web 提供web能力,必须spring-boot-starter-actuator 提供项目统计和基础的监控endpoint, 想要使用spring-boot-admin监控就必须添加了 spring-boot-devtools 开发模式 jackson-datatype-jsr310 可以解决Java8新的时间APILocalDate解体 spring-cloud-starter-eureka eureka客户端,负责维护心跳和注册 swagger 提供Restful契约 lombok 看起来很清爽的编译级别getter setter工具 guava 大而全的Java必备类库 logstash-logback-encoder 想要收集日志到ELK,使用这个appender

启动类

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

@EnableDiscoveryClient 来启用服务注册

这个ProviderDemoApplication应该放置于项目包的最外层,因为@SpringbootAppliatin包含了@ComponentScan的注解,默认扫描本类包下,否则必须手动指定scan。

Swagger

swagger就是一个配置类

 @EnableSwagger2 @Configuration public class SwaggerConfiguration { private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("服务提供者 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页面的路由,需要我们来引导下:

创建一个controller来导航

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

来一个Controller 接口

 @Api @RestController @RequestMapping("/api/v1/users") public class UserController{ private List users = Lists.newArrayList( new User(1, "谭浩强", 100, LocalDate.now()), new User(2, "严蔚敏", 120, LocalDate.now()), new User(3, "谭浩强", 100, LocalDate.now()), new User(4, "James Gosling", 150, LocalDate.now()), new User(6, "Doug Lea", 150, LocalDate.now()) ); @GetMapping("/") public List list() { return users.stream() .map(u -> new UserVo(u.getId(), u.getName(), u.getAge(), u.getBirth())) .collect(Collectors.toList()); } }

一些简单的环境配置

application.yml

 spring: application: name: provider-demo jackson: serialization: WRITE_DATES_AS_TIMESTAMPS: false default-property-inclusion: non_null #服务过期时间配置,超过这个时间没有接收到心跳EurekaServer就会将这个实例剔除 #注意,EurekaServer一定要设置eureka.server.eviction-interval-timer-in-ms否则这个配置无效,这个配置一般为服务刷新时间配置的三倍 #默认90s eureka.instance.lease-expiration-duration-in-seconds: 15 #服务刷新时间配置,每隔这个时间会主动心跳一次 #默认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

这里需要提一点,由于我集成了logstash, 所以必须安装好logstash, 见ELK入门使用。 当然可以跳过,只要不提供logback.xml的配置就行,把依赖中logstash移除即可。

Log配置

默认采用logback作为日志框架,简单配置如下,对于不想使用logstash的,移除logstash的appender即可。

在resource下新建logback-spring.xml

   <!--输出到控制台-->LoggingInterceptor  %d{HH:mm:ss.SSS} %X{req.remoteHost} %X{req.requestURI} ${appName} [%thread] %-5level %logger{36} - %msg%n <!--输出到文件-->  ${log.path}/${appName}.%d{yyyy-MM-dd}.log %d{HH:mm:ss.SSS} ${appName} %X{req.remoteHost} %X{req.requestURI} %X{req.userAgent} %X{req.method} - [%thread] %-5level %logger{36} - %msg%n <!-- 输出到logstash--> ${logstashurl}    

启动

确保eureka已启动,admin最好也启动,方便查看app状态,ELK的日志系统也最好可以使用。当然,只有eureka是刚需。

编译打包

 mvn clean install package spring-boot:repackage

运行main方法,指定profile为dev, 可以在idea中编辑运行配置,添加参数

 --spring.profiles.active=dev

或者命令行jar启动

代码如下:
java -Xms256m -Xmx1g -XX:+UseG1GC -jar ./target/provider-demo-0.0.1-SNAPSHOT.jar –spring.profiles.active=dev

启动后,访问eureka

访问admin

访问provider-demo

 

暴露我们的API给consumer

既然有服务提供者,必然是为了consumer消费。consumer应该如何消费?手动调用这个http请求即可。前面提到swagger Restful契约,就是服务提供者提供请求访问的参数和要求。consumer如果手动去开发这个client必然耗时,而且容易出错。所以,作为服务提供者,理应提供sdk或者client给consumer来用。

在spring cloud技术体系中,远程调用自然是重中之重。目前我找到的具体用法为Feign+Ribbon+Hystrix.

通过Feign的声明式接口对接,实现了consumer对provider的调用。ribbon客户端负载均衡,hystrix作健康熔断。

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

把controller的api提炼成一个接口。首先,我们创建一个新的项目

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

将这个项目放到provider-demo的依赖列表里

 <!--内部依赖--> com.testprovider-api0.0.1-SNAPSHOT<!--内部依赖end-->

抽离UserApi接口道provider-api项目中

 @RequestMapping("/api/v1/users") public interface UserApi { @GetMapping("/") List list(); }

在provider-demo的controller里改造如下

 @Api @RestController public class UserController implements UserApi { private List users = Lists.newArrayList( new User(1, "谭浩强", 100, LocalDate.now()), new User(2, "严蔚敏", 120, LocalDate.now()), new User(3, "谭浩强", 100, LocalDate.now()), new User(4, "James Gosling", 150, LocalDate.now()), new User(6, "Doug Lea", 150, LocalDate.now()) ); @Override public List list() { return users.stream() .map(u -> new UserVo(u.getId(), u.getName(), u.getAge(), u.getBirth())) .collect(Collectors.toList()); } }

这样,controller没有变化,只是被抽离了api路径。而独立出来的module provider-api就是我们给consumer提供的client。下一节使用consumer消费。

以上就是SpringCloud如何创建一个服务提供者provider的来源gao@!dai!ma.com搞$$代^@码!网详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:SpringCloud如何创建一个服务提供者provider

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址