纸上得来终觉浅, 绝知此事要躬行啊~ 果然看着很 easy, 自己搞起来就是各种坑~ 各位看官, 容我慢慢道来~
关于 springcloud 是什么我就不废话了~
Eureka
Eureka(原来以为是缩写, 原来就是一个单词, 翻译为: 我发现了, 我找到了! 0.0) 是 Netflix 开源的一款提供服务注册和发现的产品, 它提供了完整的 Service Registry 和 Service Discovery 实现. 也是 springcloud 体系中最重要最核心的组件之一.
这个东西通俗的理解就像是一个淘宝, 你是卖家也好, 还是买家也好, 你要交易, 你得在我这先注册一个账号.
1, 先新建一个 maven 工程
2, 在 pom 文件中引入相关 jar 包
学习大佬的教程, 结果用大佬的 demo 直接报错, 启动程序一直提示:
Caused by: java.lang.ClassNotFoundException: com.sun.jersey.API.core.DefaultResourceConfig
郁闷, 查看 spring-cloud-starter-eureka-server jar 包
发现其中引入的 jersey 的 jar 是 1.19.1, 然后自己研究, 发现 1.19 可以使用, 遂在 pom 文件中引入, 按照我的理解 1.19.1 肯定比 1.19 版本高的, 怎么反而不行了?
再启动, 然后这个错误是消失了, 结果后面又报错, 又出来一个 servo 包下的类找不到, mmp~ 又是版本问题, 再引入 servo 包, ok 了~
最终形成如下的 pom 配置文件
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>1.5.8.RELEASE</version>
- </parent>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter</artifactId>
- </dependency>
- <dependency>
- <groupId>com.sun.jersey</groupId>
- <artifactId>jersey-bundle</artifactId>
- <version>1.19</version>
- </dependency>
- <dependency>
- <groupId>com.netflix.servo</groupId>
- <artifactId>servo-core</artifactId>
- <version>0.12.7</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-eureka-server</artifactId>
- </dependency>
- </dependencies>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>Dalston.RC1</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <repositories>
- <repository>
- <id>spring-milestones</id>
- <name>Spring Milestones</name>
- <url>https://repo.spring.io/milestone</url>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
- </repositories>
3, 编写启动类代码
- @SpringBootApplication
- @EnableEurekaServer
- public class App {
- public static void main(String[] args) {
- SpringApplication.run(App.class, args);
- }
- }
注意添加 EnableEurekaServer 注解
4, 添加配置文件
对于这个配置文件的添加有 2 种格式, 一种是 application.properties 另外一种是 application.YAML. 对于 2 种格式的区别, 我们不做比较. 但是对于这个文件的位置, 我还是纳闷了一会, 最后经过尝试, 如图所示位置
并且需要注意文件名称一个字母都不能少 0.0, 我就是由于没注意少写个字母, 也报错了....
application.properties 格式, 文件内容如下:
- spring.application.name=spring-cloud-eureka
- server.port=8000
- eureka.client.register-with-eureka=false
- eureka.client.fetch-registry=false
- eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
注意第 3 行默认是 true 也就是如果你不加上这个 false, 启动就会报错, 因为他会想把自己注册到自己上面!!! 第 4 行默认也是 true, 意思是他要不要获取注册到服务中心的信息
5, 启动注册中心
在浏览器输入 localhost:8000, 查看注册中心是否正常启动, 出现如下截图, 说明已经 ok
有了注册中心, 我们在接着搞一个服务提供者, 和服务消费者.
服务提供者
1, 新建 maven 工程
2, 在 pom 文件中引入和注册中心服务一样的 jar 包.
3, 编写 application.properties
内容如下:
- spring.application.name=spring-cloud-producer
- server.port=9000
- eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
第一行是给自己的服务命名, 第二行设置自己的访问端口, 第三行设置自己要注册到那个注册中心, 因为我们在上面设置了 eureka 注册中心是本地的 8000 端口, 所以就写这个地址
4, 编写启动类代码
- @SpringBootApplication
- @EnableDiscoveryClient
- public class App
- {
- public static void main( String[] args )
- {
- SpringApplication.run(App.class, args);
- }
- }
注意添加 EnableDiscoveryClient 注解
5, 编写服务控制器类代码
- @RestController
- public class HelloController {
- @RequestMapping("/hello")
- public String hello(@RequestParam String name) {
- return "hello"+name+",nice to meet you!";
- }
- }
到这里 服务提供者完成, 启动程序, 无报错即可, 刷新注册中心的页面, 会看到 Application 中当前注册的服务.
服务调用者
1, 新建 maven 工程
2, 同样在 pom 文件中引入和之前一样的内容.
3, 编写 application.properties
- spring.application.name=spring-cloud-consumer
- server.port=9001
- eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
第一行也是给当前服务起名字, 第二行设置端口, 第三行设置注册中心 url.
4, 编写启动类代码
- @SpringBootApplication
- @EnableDiscoveryClient
- @EnableFeignClients
- public class App
- {
- public static void main( String[] args )
- {
- SpringApplication.run(App.class, args);
- }
- }
注意这个启动类, 比服务提供者多了一个 EnableFeignClients 注解, 这个注解的作用就是启用 feign 进行远程调用.
5, 编写 feign 调用实现
- @FeignClient(name= "spring-cloud-producer")
- public interface HelloRemote {
- @RequestMapping(value = "/hello")
- public String hello(@RequestParam(value = "name") String name);
- }
注意这是一个接口, 上面的注解参数 name, 就是指定你当前要调用的服务提供者名称. 另外还要注意方法中的参数 name 和服务提供者中的参数保持一致
6, 编写服务调用者控制器类
- @RestController
- public class ConsumerController {
- @Autowired
- HelloRemote HelloRemote;
- @RequestMapping("/hello/{name}")
- public String hello(@PathVariable("name") String name) {
- return HelloRemote.hello(name);
- }
- }
在当前类中引入 HelloRemote 接口, 通过调用本地 hello 方法, 然后再调用 HelloRemote 接口中的方法
启动程序, 无报错即可.
刷新注册中心这个时候应该可以看到 2 个服务已经注册
测试验证
打开浏览器输入 : http://localhost:9001/hello/JJ
如上图正常返回结果, 说明整个服务调用和提供者 ok!!!
来源: https://www.cnblogs.com/JJJ1990/p/10137384.html