升级微服务架构2:服务注册
微服务架构中,服务是最小的可伸缩的独立部署的单位,同一个服务提供可以有多个实例,这些实例都会注册到服务注册中心(Eureka Server)上进行统一的管理及调用的负载均衡。
因Spring Cloud的是已Java为主要开发语言,本文会先讲Java语言的服务怎么注册到服务中心,然后按照这个逻辑移植到.net版本上。
1.创建java版服务,并注册到服务中心
1.1创建一个Eureka Client的Maven项目
操作模式和上一篇使用Maven创建Eureka Server一样,模块名:userservice(用户服务)
Eureka Client和web添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
创建Spring Boot 启动类并加上注解@SpringBootApplication和@EnableEurekaClient
创建一个User实体,一个UserController类并注解为RestController,写一个返回用列表的方法。
@RestController @RequestMapping("/user") public class UserController { @RequestMapping("/getall") public List<User> getAll(){ ArrayList<User> list=new ArrayList<>(); User user1=new User(); user1.setAge(10); user1.setName("小明"); user1.setDeleted(false); User user2=new User(); user2.setAge(12); user2.setName("小红"); user2.setDeleted(true); list.add(user1); list.add(user2); return list; }
1.2配置服务中心
服务配置信息:
server:
port: 7771 #服务端口
eureka:
client:
registerWithEureka: true #是否注册
fetchRegistry: true #启用客户端缓存
serviceUrl:
defaultZone: http://peer1:8881/eureka/,http://peer2:8882/eureka/ #注册到两个服务中心
spring:
application:
name: userservice #服务名
启动该服务,刷新下服务中心,可以看到userservice已经注册成功
访问userservice获取用户的方法,成功返回Json数据
1.3启动多个userservice服务实例并注册
IEDA修改启动配置,去掉启动仅单个实例 ,Edit Configurations->选择要修改的配置->去掉勾选Single Instance only
修改userservice的端口为7772启动一个实例,启动成功后再修改端口为7773启动,这样就有三个实例注册到了服务中心
Java版的服务注册就完成了,安装这个思路使用.net core来创建个同样的服务并注册到服务中心
2.创建.net core服务,并注册到服务中心
2.1创建.net core API项目
创建一个空解决方案MicroService,然后创建一个.net core web api项目UserService
选择.net core 2.1,项目类型选择API,暂时不用HTTPS,去掉勾选
在NuGet包管理器中搜索Pivotal.Discovery.Client,选择.net core版Pivotal.Discovery.ClientCore,这个组件相当于Java中的Eureka Client组件,用于服务注册,现在最新稳定版为2.0.1,非Core版本也可以,不过最近一次更新是2017年9月份了,这里选择Core版。
2.2配置服务中心
服务注册配置可参考steeltoe官方文档,和java版的Eureka Client配置大致类似
配置文件:
{ "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": "*", /*服务注册配置*/ "spring": { "application": { "name": "userservice"/*服务名*/ } }, "eureka": { "client": { "serviceUrl": "http://localhost:8881/eureka/", /*Eureka服务地址*/ "shouldRegisterWithEureka": true,/*是否注册到Eureka Server*/ "shouldFetchRegistry": true /*开启本地缓存*/ }, "instance": { "port": 7779 /*服务端口*/ } } }
经实践发现Eureka配置文件中的serviceUrl只能用一个地址,多个服务中心地址不知道为什么注册不上,而且只能用localhost或IP,如127.0.0.1,使用peer1,peer2也注册不上,什么原因暂时还没去研究。
在Program类中指定不同环境配置文件
参考:http://steeltoe.io/docs/steeltoe-discovery/#reading-configuration-values
如不指定配置文件会导致报错:ArgumentException: Discovery client type UNKNOWN, check configuration,原因就是找不到配置文件,配置服务发现时可加Configuration.GetSection("eureka").GetChildren().Any()来判断能否取到eureka节点的配置文件。
在Startup启动类ConfigureServices方法中添加服务发现客户端配置,在Configure方法中添加使用服务发现客户端的方法
这个类似于Spring Boot的启动类中设置Eureka Client注解一样
创建一个User实体,属性和Java端一样,注意java的Getter和Setter对应的字段是小写开头,且默认is开头的序列化会去掉前面的is。
同样创建一个UserController和一个getAll方法,返回用户列表。
2.3服务启动配置并注册到服务中心
在项目属性->调试中选择IIS Express调试,并将端口设置为服务端口7779
或者直接在launchSettings.json改端口
启动VS调试该服务,浏览器调用该API,http://localhost:7779/user/getall
成功返回Json信息
再刷新下Eureka Server,发现服务以及注册成功。
到此.net core的微服务也已成功完成注册。